Java中从double到int的转换精度降低
我试着测试下面的代码,它给了我一个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
你可以在下面搜索框中键入要查询的问题!
我试着测试下面的代码,它给了我一个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
# 1 楼答案
浮点不是完美的。它使用近似值
特别是,
double
不能代表所有数字。就像1/3
不能用有限位数精确地用十进制表示一样,同样4.35
也不能用有限位数的二进制表示所以我们得到了四舍五入的结果。与^{接近但不完全相等的值。
在这种情况下,它稍微小一些,所以当你把它乘以100,你不会得到^{,你会得到几乎435,这是不完全相同的
当您强制转换到
int
时,会截断结果,因此434,999...
变成434
相反,当您使用
Math.round
时,您将434,999...
转换为435
(可以精确地表示它)如果精确地表示
4.35
是必要的,那么看看Java BigDecimal类型# 2 楼答案
浮点数不能精确地表示浮点数
你可以试着把它打印出来,你会看到
100 * f = 434.9999999
。该双精度的int
值将为434
,因为它将截断小数部分round
方法将四舍五入到最接近的int
数,即435