我用这些语句来测试

float f=4.35f;
int i=(int)(f*100);
System.out.println(i);
double d=4.35;
i=(int)(d*100);
System.out.println(i);

结果是
 435
 434

我曾经认为 float 和 double 之间的唯一区别只是精度。它们在计算中应该相同。但是我将 4.35 转换为二进制,然后将其转换回十进制,发现它实际上是 4.3499999...
因此,如果我将其乘以 100 然后进行转换,我认为答案应该是 434,同时包含浮点数和 double 数。为什么第一个是435?

最佳答案

Java 中的浮点数使用二进制表示。许多具有简短的十进制精确表示的数字,例如 4.35 ,在任何精度下都没有精确的二进制表示(无论是 floatdouble 还是其他)。

当您在 Java 程序中编写 4.35 时,它​​被解释为表示最接近 435/100 的 double。当您编写 4.35f 时,它​​被解释为表示最接近 435/100 的 float

碰巧 4.354.35f 都略低于 435/100:
在 Java 中,4.35 表示 4.349999999999996447286321199499070644378662109375,4.35f 表示 4.349999904632568359375。
在第一个近似值中,在这两种类型中,最接近的可表示值低于目标 435/100 是偶然的(尽管当深入研究它时,它没有任何随机性)。

另一方面,数字 435 可以完全表示为 floatdouble

当将 4.35f4.35 乘以 100(也可以完全表示为 floatdouble)时,会发生以下两种可能性之一:

  • 乘法的数学结果比任何其他浮点数更接近 435。然后选择 435 作为操作的结果。您必须记住,Java 不知道它正在乘以 4.35 的数字。据它所知,你故意选择了一个低于 4.35 的数字。也许您真的打算将操作数设为 4.349999904632568359375。这是乘法期间第二次近似的结果,最终结果是 435。无论如何,将浮点数 435 转换为 int 会产生 int 435 。这就是 float 的情况。
  • 乘法的数学结果最接近 435 以下的浮点数。在这种情况下,选择该浮点数作为浮点乘法的结果。将此结果转换为 int 会产生 434 ,因为从浮点数到整数的转换是通过截断进行的。这就是 double 的情况。 4.3499999999999996447286321199499070644378662109375 乘以 100 产生的数学结果接近 double 正下方的 435.0(此 double 为 434.9999999999994315658113919198513031005859375 的乘法结果,因此该乘法是浮点数)。
  • 关于java - 在java中将float和double转换为int有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24099337/

    10-11 03:53