2017-07-16 3 views
-2

ONLY 0.39(奇妙な番号)でダブルを追加する際の奇妙な動作について、いくつかの提案が必要です。あなたがBigDecimalを使用する場合はまずスニペットは0.39Javaで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

で0.38と第二との適切な例を持っている、あなたはStringを取るバージョンを使用します。 doubleを使用すると、が既にの精度を失っています。あなたは、あなた使用することを選択するかもしれないdoubleを使用する必要がある場合は、(予想通り)2618.39

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

しかしため

2618.38 

を出力

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

フォーマットされた出力(これはro

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) –

関連する問題