在java中丢失精度从int转换为double

时间:2013-10-06 22:10:32

标签: java precision

我试着测试下面的代码,它给了我一个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

2 个答案:

答案 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类型。