gpt4 book ai didi

java - 在 java 中将 float 和 double 转换为 int 有什么区别?

转载 作者:搜寻专家 更新时间:2023-11-01 02:08:42 25 4
gpt4 key购买 nike

我用这些语句来测试

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,同时具有 float 和 double。为什么第一个是435?

最佳答案

Java 中的 float 使用二进制表示。许多具有十进制短精确表示的数字,例如 4.35,在任何精度下都没有二进制的精确表示(例如 floatdouble 或另一个)。

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

碰巧 4.354.35f 都略低于 435/100:在Java中,4.35代表4.3499999999999996447286321199499070644378662109375,4.35f代表4.349999904632568359375。在第一个近似值中,这两种类型中最接近的可表示值都低于目标 435/100 的可能性很小(尽管在更深入地观察它时,它没有任何随机性)。

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

当将 4.35f4.35 乘以 100 时(也可以精确表示为 floatdouble ), 出现以下两种可能性之一:

  • 相乘的数学结果比任何其他 float 更接近 435。然后选择 435 作为操作的结果。您必须记住,Java 并不知道它正在乘以一个本应为 4.35 的数字。据它所知,你是故意选择了一个低于 4.35 的数字。也许您真的希望操作数为 4.349999904632568359375。这是乘法过程中二次近似的结果,最终结果是 435。无论如何,将 float 435 转换为 int 会产生 int 435 。这就是 float 的情况。

  • 乘法的数学结果最接近 435 以下的 float 。在本例中,选择该 float 作为浮点乘法的结果。将此结果转换为 int 会生成 434,因为从 float 到整数的转换是通过截断 进行的。这就是 double 的情况。 Multiplying 4.3499999999999996447286321199499070644378662109375 by 100 produces a mathematical result that is close to the double immediately below 435.0 (this double is 434.99999999999994315658113919198513031005859375 ),因此这个 double 被用作浮点乘法的结果。

关于java - 在 java 中将 float 和 double 转换为 int 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24099337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com