Java float 到 long 显式转换

标签 java casting floating-point type-conversion floating-accuracy

我想了解如何 i这段代码最终是 99999904 ?

long i = (long)(99999900f);
System.out.println(i);

我知道 float 是用小数存储的,并不是它们看起来的确切值,但我不明白这如何导致第一个数字是 4 而不是 9 或最终会四舍五入的数字99999900?

最佳答案

I'd like to understand how i in this piece of code ends up being 99999904

99999904 的二进制表示比 99999900 更简单(使用更少的有效数字),并且由于后者需要比可以存储在 float 中更多的有效数字,因此 Java 必须使用最接近的可表示值。

99999900 in hex: 0x5F5E09C
What 24 significant binary digits look like in hex:
                 0x7FFFFF8
99999904 in hex: 0x5F5E0A0

在两个最接近的可表示值 0x5F5E098 和 0x5F5E0A0 之间,Java 根据 “nearest-even” 选择了后者。规则。这两个可表示的值实际上同样接近,但 0x5F5E0A0 的最后一个有效数字为 0,因此根据此规则进行选择。您可以自己检查 99999899 向下舍入为 0x5F5E098,99999900 向上舍入为 0x5F5E0A0。

float 类型有 24 位有效二进制数字,可以准确表示 0 到 224-1 之间的所有整数。 224 恰好也可以精确表示(它只有一位有效数字),但 224+1 或 16777217 不能精确表示为 float ,并且其上方的整数也不会自动精确地表示为float

关于Java float 到 long 显式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35518783/

相关文章:

新 AmazonS3Client 上的 java.lang.NoClassDefFoundError

MATLAB 将大端顺序字节转换为浮点值

casting - 快速子类和类型转换

java - 为什么使用整型变量会抛出异常?

algorithm - 如何找到为每个 double 值产生较小输出的乘数?

java - 将第二个参数传递给 Guava Cache load() 方法

java - hibernate 没有在 spring mvc 中更新

java - ProgressDialog 和 TabGroup

Java 无法在没有明显冗余类型转换的情况下正确推断流类型

C#继承类型转换错误