我试着测试下面的代码,它给了我一个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
答案 0 :(得分:2)
浮点数不能完全代表浮点数。
您可以尝试打印它,您会看到100 * f = 434.9999999
。该双精度的int
值将为434
,因为它会截断小数部分。
round
方法将舍入到最接近的int
个数字,即435
。
答案 1 :(得分:2)
浮点并不完美。它使用近似值。
特别是,double
s不能代表所有数字。就像1/3
无法使用有限数量的位数精确地用十进制表示一样,所以4.35
也不能用有限位数的二进制表示。
所以我们得到舍入结果。 关闭到4.35
的值,但不完全相等。
在这种情况下,它有点小,所以当你将它乘以100时,你得不到435
,你得到的接近435 ,这是不太一样的。
当您转换为int
时,会截断结果,因此434,999...
变为434
。
相反,当您使用Math.round
时,您将434,999...
转换为435
(可以精确表示)。
如果需要精确表示4.35
,请查看Java BigDecimal类型。