JAvaにおけるdouble計算精度の問題
最近、仕事中にdouble精度に関する問題に遭遇し、記録しました.
まず次のコードを参照してください.最終的な計算結果は等しくありません.最終的なinvoiceItemMoneyAmountの値が168.8200000億2になったからです.
どうしてそうなの?研究して、いくつかの資料を調べました.理由はこうです.
Javaで浮動小数点数タイプ:doubleは、一般的に演算はできません.Javaだけでなく、他の言語もそうです.effective Javaという本にも言及されていますが、doubleは一般的に科学計算やエンジニアリング計算としてしか使用できません.ビジネス計算ではjava.math.BigDecimalが一般的に使われているので、BigDecimalのaddメソッドで計算する必要があります.
以下のコードで、結果計算は同じです.
まず次のコードを参照してください.最終的な計算結果は等しくありません.最終的なinvoiceItemMoneyAmountの値が168.8200000億2になったからです.
double money= 168.82;
List itemMoneyList = Lists.newArrayList();
itemMoneyList.add("23.80");
itemMoneyList.add("3.00");
itemMoneyList.add("142.02");
double invoiceItemMoneyAmount = 0.00;
for(String itemMoney : itemMoneyList){
invoiceItemMoneyAmount = invoiceItemMoneyAmount + Double.valueOf(itemMoney);
}
if(money == invoiceItemMoneyAmount)
System.out.println("hello world");
どうしてそうなの?研究して、いくつかの資料を調べました.理由はこうです.
Javaで浮動小数点数タイプ:doubleは、一般的に演算はできません.Javaだけでなく、他の言語もそうです.effective Javaという本にも言及されていますが、doubleは一般的に科学計算やエンジニアリング計算としてしか使用できません.ビジネス計算ではjava.math.BigDecimalが一般的に使われているので、BigDecimalのaddメソッドで計算する必要があります.
以下のコードで、結果計算は同じです.
double money= 168.82;
List itemMoneyList = Lists.newArrayList();
itemMoneyList.add("23.80");
itemMoneyList.add("3.00");
itemMoneyList.add("142.02");
BigDecimal invoiceItemMoneyAmount = new BigDecimal("0");
for(String itemMoney : itemMoneyList){
invoiceItemMoneyAmount = invoiceItemMoneyAmount.add(new BigDecimal(itemMoney));
}
if(money == invoiceItemMoneyAmount.doubleValue())
System.out.println("hello world");