我有这样的代码示例:打印浮点值
float approx = 1234567712f;
System.out.println(approx);
而不是印刷“1.234567712E9”或类似的东西它打印“1.23456768E9”。据我所知,这与二进制级别的精度有关。
浮点数的精度(逗号(“,”符号之前和之后)有多少个二进制数字?你能以简单的方式解释它为什么会发生这种情况?
我有这样的代码示例:打印浮点值
float approx = 1234567712f;
System.out.println(approx);
而不是印刷“1.234567712E9”或类似的东西它打印“1.23456768E9”。据我所知,这与二进制级别的精度有关。
浮点数的精度(逗号(“,”符号之前和之后)有多少个二进制数字?你能以简单的方式解释它为什么会发生这种情况?
float在逗号前后的精度最高可达7位数。这就是为什么1234567是正确的,其他3位数字不正确。 如果要用高数字计算,则应该使用double而不是float
浮点数包含“有效数”和“指数”。为了表示整数直到最后一个奇数,指数必须为零。这意味着,你必须使用24位(第24位始终为1,因此不存储),并且可以存储的最大整数是
0xFFFFFF == 16777215
当你想添加2这个数字,“准确”代表将是
0x1000001 = 16777217
你需要25位来存储这个数字;所以最后一位被砍掉,这个数字将被存储为
0x800000 x 2^1 == 16777216
随着数字变大时,“跳”连续表示的数字之间变大。当你到达
1234567112 == 0x4995FFC8
你需要32位来存储它。但你只有24位,所以它会在内部的东西存放像
0x499600 x 2^8 (rounded to the closest number).
= 0x49960000 = 1234567168
这是你看到的数字。
http://en.wikipedia.org/wiki/Single-precision_floating-point_format – rgettman
这个问题已被问到100次的不同形式。它总是回到这样一个事实,即32位浮点数的“有效位”只有23位。你不能表示一个数字比2^24中的一个部分更精确。因此在浮点上,2^24 + 1 == 2^24。和2^24〜16M。请参阅[每个计算机科学家应该了解的浮点数](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – Floris