我有这个代码示例:
float approx = 1234567712f;
System.out.println(approx);
它不是打印“1.234567712E9”或类似的东西,而是打印“1.23456768E9”。据我了解,这与二进制级别的精度有关。
浮点数的精度是多少个二进制位(在逗号 (",") 符号之前和之后)?你能用简单的方式解释一下为什么会这样吗?
我有这个代码示例:
float approx = 1234567712f;
System.out.println(approx);
它不是打印“1.234567712E9”或类似的东西,而是打印“1.23456768E9”。据我了解,这与二进制级别的精度有关。
浮点数的精度是多少个二进制位(在逗号 (",") 符号之前和之后)?你能用简单的方式解释一下为什么会这样吗?
浮点数由“有效数”和“指数”组成。为了表示整数到最后一个奇数,指数必须为零。这意味着您有 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
这是你看到的数字。
float 在逗号前后的精度高达 7 位。这就是为什么 1234567 是正确的,而其他 3 位数字不是。如果你想用大数字计算,你应该使用 double 而不是 float