2

我有这个代码示例:

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

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

浮点数的精度是多少个二进制位(在逗号 (",") 符号之前和之后)?你能用简单的方式解释一下为什么会这样吗?

4

2 回答 2

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

这是你看到的数字。

于 2013-11-22T19:39:14.593 回答
0

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

于 2013-11-22T19:30:28.467 回答