我尝试测试以下代码,结果给了我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类型。