我尝试测试以下代码,它在 n 上给了我一个 434,这是我没有预料到的结果,这种精度损失的原因是什么?
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
s 不能代表所有的数字。就像1/3
不能用有限位数的十进制精确表示一样,也不能用有限位数4.35
的二进制表示。
所以我们得到了四舍五入的结果。接近4.35
但不完全相等的值。在这种情况下,它有点小,所以当你将它乘以 100 时,你不会得到435
,你会得到几乎 435,这不太一样。
当您转换为 时int
,您会截断结果,因此434,999...
变为 just 434
。
相反,当您使用 时Math.round
,您将转换434,999...
为精确435
(可以精确表示)。
如果需要精确表示4.35
,请查看 Java BigDecimal类型。
浮点数不能准确地表示浮点数。
您可以尝试打印它,您会看到100 * f = 434.9999999
. 该int
双精度值将434
截断小数部分。
该round
方法将四舍五入到最接近的int
数字,即435
.