浮动精度问题

时间:2017-04-04 12:15:11

标签: java floating-point precision

我有以下代码。

public class ToBeDeleted {

    public static final float MAX_PHYSICAL_LENGTH = 100000000;

    public static void main(String[] args) {
                    //100000000
        float temp = 100000000 -4;

        System.out.println(temp);

        if (MAX_PHYSICAL_LENGTH == temp)
            System.out.println("True statement");
        else
            System.out.println("False Statement");

    }

}

以上的输出是

1.0E8
True statement

现在使用以下代码

public class ToBeDeleted {

    public static final float MAX_PHYSICAL_LENGTH = 100000000;

    public static void main(String[] args) {
                    //100000000
        float temp = 100000000 -5;

        System.out.println(temp);

        if (MAX_PHYSICAL_LENGTH == temp)
            System.out.println("True statement");
        else
            System.out.println("False Statement");

    }

}

输出

9.9999992E7
False Statement

问题是

  1. 第一个代码片段出了什么问题。这不是普通的数学吗? 就浮动而言?
  2. 为什么它会在第二个代码片段上给出预期的输出。

1 个答案:

答案 0 :(得分:3)

典型(即IEEE754)float仅具有23位精度。其他位用于指数和符号。您无法准确存储的最小整数是1加上2的24次幂。

100000000 - 4100000000 - 0无法区分。

Java double为您提供52位精度,因此有足够的空间来存储所有整数,精确到最高为53的幂。

有关详细信息,请参阅Which is the first integer that an IEEE 754 float is incapable of representing exactly?

但如果您需要精确小数精度,则使用小数类型。