Java的'=='运算符是双精度数

ami*_*ham 9 java floating-point equals-operator

此方法返回'true'.为什么?

public static boolean f() {
   double val = Double.MAX_VALUE/10;
   double save = val;
   for (int i = 1; i < 1000; i++) {
       val -= i;
   }
   return (val == save);
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 25

你从一个巨大的值中减去了一个很小的值(小于1000).小值远小于理论结果的最接近可表示值仍然是原始值的大值.

基本上它是浮点数运算方式的结果.

想象一下,我们有一些十进制浮点类型(只是为了简单),它只在尾数中存储了5位有效数字,并且在0到1000范围内存储了一个指数.

你的例子就像写10 999 - 1000 ...当四舍五入到5位有效数字时,想想结果会是什么.是的,确切的结果是99999 ..... 9000(有999位数字)但是如果你只能用5位有效数字表示值,那么最接近的结果是10 999.