1

我尝试测试以下代码,它在 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
4

2 回答 2

3

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

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

所以我们得到了四舍五入的结果。接近4.35但不完全相等的值。在这种情况下,它有点小,所以当你将它乘以 100 时,你不会得到435,你会得到几乎 435,这不太一样。

当您转换为 时int,您会截断结果,因此434,999...变为 just 434

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

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

于 2013-10-06T22:16:26.623 回答
2

浮点数不能准确地表示浮点数。

您可以尝试打印它,您会看到100 * f = 434.9999999. 该int双精度值将434截断小数部分。

round方法将四舍五入到最接近的int数字,即435.

于 2013-10-06T22:13:49.930 回答