Boz*_*zho 1 java floating-point
我刚刚偶然发现了以下问题。虽然我知道浮点数和双精度数有其怪癖,但这听起来很奇怪。有人可以解释一下(Java 11)吗?
System.out.println(Float.valueOf(Float.parseFloat("76028223")).intValue());
System.out.println(Double.valueOf(Double.parseDouble("76028223")).intValue());
Run Code Online (Sandbox Code Playgroud)
结果:
76028224
76028223
Run Code Online (Sandbox Code Playgroud)
ζ--*_*ζ-- 10
使用指数尾数表示形式存储浮点数(类似于小学中教授的科学记数法)。可用于存储尾数和指数的位数取决于特定类型(Java 中的浮点型与双精度型,以及此处和其他地方列出的更不常见的类型)。
表示数值 76028223(尚未引用任何特定浮点类型)的一种方法是 1.00100010000001100100111111 2 * 2^26。
a 的尾数float代表 24 位(23 位存储在 float 中,1 位隐含1),这意味着它不能代表 1.00100010000001100100111111 的所有有效位。该尾数需要 27 位才能准确表示。
相反,我们对浮点数能做的最好的事情就是使用最接近的 24 位(1.23 位)尾数,即 1.00100010000001100101000(通过对前一个尾数进行舍入而获得)。该尾数与正确的指数相结合,表示 1.00100010000001100101000 2 * 2^26 = 76028224。
这种截断会导致许多意想不到的惊喜,例如76028223f + 1 == 76028223ftrue (与该浮点文字最接近的表示形式是 76028224,并且最接近的浮点表示形式 76028224+1 也是 76028224)。
Adouble具有更高的精度,因此具有更大的指数范围 + 更高精度的尾数(53 位,其中 52 位显式存储),因此它可以精确地表示您选择的输入。
1对于非次正规浮点数,“小数点”之前的前导位始终为 1 ,因此不需要存储。
| 归档时间: |
|
| 查看次数: |
1018 次 |
| 最近记录: |