Java 将数字四舍五入到小数点后2位失败

Java 将数字四舍五入到小数点后2位失败,java,Java,我在计算利率时有一个讨厌的错误:我必须把答案四舍五入到最接近的一美分,但是 interest = Math.round(interest * 100) / 100; 删除整个小数部分利息是一种双重类型。为什么会这样?等效代码在C++中很好。让我们把使用二进制浮点的潜在问题放在一个需要精确十进制表示的数量上。 Java董事会打破了传统,决定Math.round(interest*100)应该返回long,而不是double。(我想他们这样做是因为任何不是整数的double都会被四舍五入到一个适合

我在计算利率时有一个讨厌的错误:我必须把答案四舍五入到最接近的一美分,但是

interest = Math.round(interest * 100) / 100;

删除整个小数部分<代码>利息是一种
双重
类型。为什么会这样?等效代码在C++中很好。

让我们把使用二进制浮点的潜在问题放在一个需要精确十进制表示的数量上。 Java董事会打破了传统,决定
Math.round(interest*100)
应该返回
long
,而不是
double
。(我想他们这样做是因为任何不是整数的
double
都会被四舍五入到一个适合
long
类型的整数)。那么这个表达呢

Math.round(interest * 100) / 100
在整数运算中求值,因此任何余数都将被丢弃。在我看来,最清晰的解决办法是写作

interest = Math.round(interest * 100) / 100.0;
它强制以浮点形式进行求值


还请注意,即使在应用了此舍入之后,生成的基础浮点值的尾随数字通常也会超过小数点后的第二位:双精度(
double
仅提供15位十进制有效数字的精度。

真正的错误在于,您使用浮点表示货币。永远不要那样做。使用<代码> BigDecimal <代码>。我已经看过了复制品,但真的很难做舍入吗?出于兴趣,你在C++中的等效代码是什么?我们有::floor和::ceil,但没有“开箱即用”的德语舍入功能。是的,它真的很复杂。问题正如我在那里所说的那样。浮点数没有小数位数。它们有两个位置。如果需要小数位数,请使用小数基数,即
BigDecimal
。我在那里的回答完全驳斥了
*100/100
骗局。没用了,谢谢。我希望事情会像那样简单!很高兴。但是一定要注意对货币值使用
double
时的注意事项。这可能会迫使计算采用浮点形式,但它也无法将数字四舍五入到小数点后两位。@EJP:这是一个非常非常好的点。我已经说得很清楚了。
double
在整数值中只给出15.9位十进制有效数字。当分数进入时,所有的赌注都输掉了。