2013-11-22 111 views
2

我有这样的代码示例:打印浮点值

float approx = 1234567712f; 
System.out.println(approx); 

而不是印刷“1.234567712E9”或类似的东西它打印“1.23456768E9”。据我所知,这与二进制级别的精度有关。

浮点数的精度(逗号(“,”符号之前和之后)有多少个二进制数字?你能以简单的方式解释它为什么会发生这种情况?

+0

http://en.wikipedia.org/wiki/Single-precision_floating-point_format – rgettman

+1

这个问题已被问到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

回答

0

float在逗号前后的精度最高可达7位数。这就是为什么1234567是正确的,其他3位数字不正确。 如果要用高数字计算,则应该使用double而不是float

2

浮点数包含“有效数”和“指数”。为了表示整数直到最后一个奇数,指数必须为零。这意味着,你必须使用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

这是你看到的数字。