0
我想了解i
在这段代码中的结尾是99999904吗?Java float长时间显式转换
long i = (long)(99999900f);
System.out.println(i);
据我所知,花车存储与小数和不准确的价值,他们似乎是,但我看不出这有可能导致第一个数字是4,而不是9或东西会最终达到99999900?
我想了解i
在这段代码中的结尾是99999904吗?Java float长时间显式转换
long i = (long)(99999900f);
System.out.println(i);
据我所知,花车存储与小数和不准确的价值,他们似乎是,但我看不出这有可能导致第一个数字是4,而不是9或东西会最终达到99999900?
我想了解如何在这段代码最终被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
无论是。
试试'System.out.println(99999900f);' –
9.9999904E7最简短的评论,曾经有过这么清楚的解释过!是否所有浮动数字都以该格式存储?即在小数点之前有1位数字?谢谢 – Randy
没关系,刚刚测试过一对,似乎随着数字的增长,我们在小数中存储了更多的数字,可能是因为我们可以适合大于浮点大小的数字。再次感谢 – Randy