【问题标题】:Printing floating point value打印浮点值
【发布时间】:2013-11-22 19:21:30
【问题描述】:

我有这个代码示例:

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

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

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

【问题讨论】:

标签: java int type-conversion floating-point-conversion


【解决方案1】:

浮点数由“有效数”和“指数”组成。为了表示整数到最后一个奇数,指数必须为零。这意味着您有 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

这是你看到的数字。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-03-18
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多