有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

共 (2) 个答案

  1. # 1 楼答案

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

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

    所以我们得到了四舍五入的结果。与^{接近但不完全相等的值。 在这种情况下,它稍微小一些,所以当你把它乘以100,你不会得到^{,你会得到几乎435,这是不完全相同的

    当您强制转换到int时,会截断结果,因此434,999...变成434

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

    如果精确地表示4.35是必要的,那么看看Java BigDecimal类型

  2. # 2 楼答案

    浮点数不能精确地表示浮点数

    你可以试着把它打印出来,你会看到100 * f = 434.9999999。该双精度的int值将为434,因为它将截断小数部分

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