我尝试测试以下代码,结果给了我434的n值,这是我没有预料到的,这种精度下降的原因是什么?

double f = 4.35;
int n =  (int) (100 * f); // n will be 434 - why?
n = (int) Math.round(100*f); // n will be 435

最佳答案

浮点数并不完美。它使用近似值。

特别是double不能代表所有数字。就像1/3不能用有限数目的数字精确地以十进制表示一样,4.35也不能用有限数目的二进制数来精确表示。

这样我们得出的结果就很全面。接近4.35但不完全相等的值。
在这种情况下,它要小一些,所以当您将其乘以100时,您不会得到435,几乎得到435,这并不完全相同。

转换为int时,将截断结果,因此434,999...变为434

相反,使用Math.round时,会将434,999...转换为精确的435(可以精确表示)。

如果需要精确表示4.35,请查看Java BigDecimal类型。

09-26 11:47