Java浮点整数算术

Ric*_*ard 2 java floating-point

鉴于输出的布尔值下面的代码是

A: false
B: false
C: true
Run Code Online (Sandbox Code Playgroud)

当我试图减去V1 + V2的总和时,任何小于65的东西都不起作用,就好像减法永远不会发生一样.如果我将原语切换为double,问题就解决了.为什么会这样?

private static final float V1 = 1076712940;
private static final float V2 = 1070770707;

public static void main(final String[] args) {
    final float y = V1 + V2;//2147483647

    System.out.println("A: ((y - 64) - 1) == (y - 65) --> "
                        + (((y - 64) - 1) == (y - 65))); /* A */
    System.out.println("B: (y > y - 64) --> " + (y > y - 64)); /* B */
    System.out.println("C: (y > y - 65) --> " + (y > y - 65)); /* C */
}
Run Code Online (Sandbox Code Playgroud)

Spe*_*cer 9

浮点数由符号位,尾数和指数表示在存储器中,它们基本上是二进制分数.许多十进制数不能完全表示为二进制分数.在指数或尾数中具有附加位将允许更高的精度水平.

我相信在你的情况下,你已经保存的浮点数和减少64的值之间的差异不是一个足够大的变化,以具有不同的浮点表示.但是,因为double在尾数和指数中有额外的位,所以它可以更精确,并准确地表示减法.