我用这些语句来测试
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
,在任何精度下都没有精确的二进制表示(无论是 float
、 double
还是其他)。
当您在 Java 程序中编写 4.35
时,它被解释为表示最接近 435/100 的 double
。当您编写 4.35f
时,它被解释为表示最接近 435/100 的 float
。
碰巧 4.35
和 4.35f
都略低于 435/100:
在 Java 中,4.35
表示 4.349999999999996447286321199499070644378662109375,4.35f
表示 4.349999904632568359375。
在第一个近似值中,在这两种类型中,最接近的可表示值低于目标 435/100 是偶然的(尽管当深入研究它时,它没有任何随机性)。
另一方面,数字 435
可以完全表示为 float
和 double
。
当将 4.35f
或 4.35
乘以 100(也可以完全表示为 float
和 double
)时,会发生以下两种可能性之一:
435
作为操作的结果。您必须记住,Java 不知道它正在乘以 4.35 的数字。据它所知,你故意选择了一个低于 4.35 的数字。也许您真的打算将操作数设为 4.349999904632568359375。这是乘法期间第二次近似的结果,最终结果是 435。无论如何,将浮点数 435
转换为 int
会产生 int 435
。这就是 float
的情况。 int
会产生 434
,因为从浮点数到整数的转换是通过截断进行的。这就是 double
的情况。 4.3499999999999996447286321199499070644378662109375
乘以 100 产生的数学结果接近 double
正下方的 435.0
(此 double
为 434.9999999999994315658113919198513031005859375 的乘法结果,因此该乘法是浮点数)。 关于java - 在java中将float和double转换为int有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24099337/