2017-07-16 67 views
-2

需要几个关于添加一个只有0.39(奇怪数字)的双精度奇怪行为的建议。第一个片段与0.38正确例如,用0.39在Java中添加0.39双变量

// code snippet 1 : Adding xxxx.38 to xxxx.00 

double b =1031.38; 
double a =1587.00; 
System.out.println ("using double  "+(a+b)); 

BigDecimal premium = BigDecimal.valueOf(a); 
BigDecimal netToCompany = BigDecimal.valueOf(b); 
double result =Double.parseDouble(premium.add(netToCompany).toString()); 
System.out.println("using BigDecimal "+result); 

// correct Output xxxx.38 + xxxx.00 = xxxx.38 

using double  2618.38 
using BigDecimal 2618.38 

***** ------------------------------ ****** 

// code snippet 2 : Adding xxxx.39 to xxxx.00 

double b =1031.39; 
double a =1587.00; 
System.out.println("using double  "+(a+b)); 

BigDecimal premium = BigDecimal.valueOf(a); 
BigDecimal netToCompany = BigDecimal.valueOf(b); 
double result = Double.parseDouble(premium.add(netToCompany).toString()); 

// wrong Output xxxx.39 + xxxx.00 = xxxx.3900000000003 

using double 2618.3900000000003 
using BigDecimal 2618.39 

回答

1

第二当你使用BigDecimal,您要使用,需要一个String版本。如果您使用double,那么您已经有已经失去精确度

BigDecimal premium = new BigDecimal("1031.38"); 
BigDecimal netToCompany = new BigDecimal("1587.00"); 

其输出(如预期)

2618.38 

2618.39

BigDecimal premium = new BigDecimal("1031.39"); 
BigDecimal netToCompany = new BigDecimal("1587.00"); 
System.out.println(premium.add(netToCompany)); 

,如果你需要使用double,你可能选择使用格式化的输出(将ro UND你)喜欢

double[] premiums = { 1031.38, 1031.39 }; 
double netToCompany = 1587.0; 
for (double premium : premiums) { 
    System.out.printf("%.2f%n", premium + netToCompany); 
} 
+0

谢谢,我知道格式,但我不应该按照needm的问题是只有0.39,为什么我们越来越2618.3900000000003。小数点后的长000s。不会发生任何otjer数字。如果我没有选择建议,将做格式。 Thx –

+0

@ N.Murali [smbc - '0.1 + 0.2'](http://www.smbc-comics.com/?id=2999) –