在Java中比较float和int是否安全?

时间:2017-01-14 18:37:46

标签: java floating-point

比较浮点数和这样的整数是否安全?

private static void foo(float n) {
    if (n >= 1 || n <= 0) {
      // code 
    } 
}

根据JLS (5.6.2. Binary Numeric Promotion),如果其中一个参数为float,则另一个参数在比较之前转换为float。 但据我所知,如果转换后的浮点数与原始浮点数相同,则此类比较将返回true。我们怎样才能确保它?

1 个答案:

答案 0 :(得分:6)

是的,您的具体示例很好,因为01都可以准确地表示为float

请注意,一般情况并非如此:有许多大的int值无法完全表示为float。例如,以下打印出trueIdeone),即使2_000_000_001不等于2_000_000_000:

import java.util.*;
import java.lang.*;
import java.io.*;

class FloatTest {

    private static boolean isTwoBillion(float f) {
        return f == 2_000_000_000;
    }

    public static void main (String[] args) {
        System.out.println(isTwoBillion(2_000_000_001));
    }

}

请注意,与float不同,double具有足够宽的尾数来存储每个32位int值。

但是,有long个值无法表示为double。这开始于long9_223_372_036_854_764 Long.MAX_VALUE/1000 - 10。第一个更大(...765)没有double对应,而以下数字(...766)确实如此。换句话说,从...764作为double开始,当转换回...766时,递增尾数的最后一位会给出long