2017-07-16 68 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) –