我对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
答案 0 :(得分:1)
What Every Computer Scientist Should Know About Floating-Point Arithmetic
有许多值无法在IEEE-54存储下精确表达。一个更高精度的解决方案是使用java.math.BigDecimal和java.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