我在利率计算中有一个令人讨厌的错误:我必须将答案四舍五入到最近的分数,但是
interest = Math.round(interest * 100) / 100;
删除整个小数部分。 interest
是double
类型。为什么是这样?等效代码在C ++中工作正常。
答案 0 :(得分:3)
让我们将您使用二进制浮点的潜在更大问题留给需要精确十进制表示的数量。
Java人体破坏了传统,并决定Math.round(interest * 100)
应该返回long
,而不是double
。 (我想他们这样做了,因为任何不是整数的double
都会四舍五入到一个可以适合long
类型的整数。所以表达式
Math.round(interest * 100) / 100
以整数运算进行计算,因此丢弃任何余数。我认为最明确的解决方法是写
interest = Math.round(interest * 100) / 100.0;
迫使评估以浮点发生。
另请注意,即使在应用此舍入后,结果的基础浮点值通常也会在第2个小数位后面跟踪非零数字:double
仅给出15个十进制有效数字精度。