0

我想了解i在这段代码中的结尾是99999904吗?Java float长时间显式转换

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

据我所知,花车存储与小数和不准确的价值,他们似乎是,但我看不出这有可能导致第一个数字是4,而不是9或东西会最终达到99999900?

+2

试试'System.out.println(99999900f);' –

+0

9.9999904E7最简短的评论,曾经有过这么清楚的解释过!是否所有浮动数字都以该格式存储?即在小数点之前有1位数字?谢谢 – Randy

+0

没关系,刚刚测试过一对,似乎随着数字的增长,我们在小数中存储了更多的数字,可能是因为我们可以适合大于浮点大小的数字。再次感谢 – Randy

回答

1

我想了解如何在这段代码最终被99999904

99999904具有二进制一个简单的表示比99999900(使用较少的显著位),因为后者需要比可以存储在浮点数中更有意义的数字,Java必须使用最接近的可表示值。

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

两个最接近的可表示值0x5F5E098和0x5F5E0A0之间,爪哇根据“nearest-even”规则选择了后者。两个可表示的值实际上相等,但0x5F5E0A0对于最后一位有效数字为0,因此根据此规则进行选择。你可以自己检查99999899舍入到0x5F5E098和99999900舍入到0x5F5E0A0。

对于float类型有24个重要的二进制数字,可以精确地表示0到2之间的所有整数。 2 恰巧也可以精确地表示(它只有一个有效数字),但是不能准确地表示为float,而且它上面的整数不能自动精确表示为float无论是。