Java对double值的计算会产生意外结果

时间:2014-01-22 04:20:22

标签: java double

我对java程序中的double值进行了简单的计算。

double blockNetMoney=1239891.632;
double blockQty=1120000;
double allocQty=150000;
BigDecimal allocNetMoney = new BigDecimal(String.valueOf((allocQty/blockQty)*blockNetMoney));
System.out.println("AllocNetMoney:"+allocNetMoney );

我为Alloc Net获得了166056.91499999998的价值。 但正确的值是166056.915,当我使用计算器或Excel时,我得到了该值。

您能否建议我需要做出哪些更改才能获得值166056.915

1 个答案:

答案 0 :(得分:1)

What Every Computer Scientist Should Know About Floating-Point Arithmetic

有许多值无法在IEEE-54存储下精确表达。一个更高精度的解决方案是使用java.math.BigDecimaljava.math.MathContext通过 - 例如 -

BigDecimal blockNetMoney = new BigDecimal(
    "1239891.632");
BigDecimal blockQty = new BigDecimal("1120000");
BigDecimal allocQty = new BigDecimal("150000");
BigDecimal allocNetMoney = allocQty.divide(
    blockQty, new MathContext(10)).multiply( // <-- 10 digits of precision
    blockNetMoney, new MathContext(9));      // <-- 9 digits of output.
System.out.println("AllocNetMoney:"
    + allocNetMoney);

输出

AllocNetMoney:166056.915