10011001100110011001101

10011001100110011001101

执行以下代码时:

public class FPoint {
    public static void main(String[] args) {
        float f = 0.1f;
        for(int i = 0; i<9; i++) {
            f += 0.1f;
        }
        System.out.println(f);
    }
}

显示以下输出:

1.0000001

但是输出应该是 1.0000000 ,对吗?如果我错了纠正我..!!

最佳答案

对于IEEE 754标准,0.1并不是真正的“0.1”。

编码为0.1:0 01111011 10011001100110011001101(带有浮点数)

  • 0是符号(=正数)
  • 01111011指数(= 123-> 123-127 = -4 (127是IEEE 754中的偏差))
  • 10011001100110011001101尾数

  • 要将尾数转换为十进制数,我们有
    1.10011001100110011001101 * 2 ^ -4 (base2)[1.xxx在IEEE 754中是隐式的]

    = 0.000110011001100110011001101(base2)

    = 1/2 ^ 4 + 1/2 ^ 5 + 1/2 ^ 8 + 1/2 ^ 9 + 1/2 ^ 12 + 1/2 ^ 13 + 1/2 ^ 16 + 1/2 ^ 17 +1 / 2 ^ 20 + 1/2 ^ 21 + 1/2 ^ 24 + 1/2 ^ 25 + 1/2 ^ 27(以10为基)

    = 1/16 + 1/32 + 1/256 + 1/512 + 1/4096 + 1/8192 + 1/65536 + 1/131072 ...(base10)

    = 0.10000000149011612 (base10)

    07-27 13:45