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

Mak*_*iev 2 java floating-point

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

private static void foo(float n) {
    if (n >= 1 || n <= 0) {
      // code 
    } 
}
Run Code Online (Sandbox Code Playgroud)

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

NPE*_*NPE 6

是的,你的具体的例子是很好的,因为二者01可以准确地表示为float.

请注意,这通常不正确:有许多大int值不能完全表示为a float.例如,即使2_000_000_001不等于2_000_000_000,以下打印出true(Ideone):

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));
    }

}
Run Code Online (Sandbox Code Playgroud)

请注意,与尾数相比float,double尾数足以存储每个32位int值.

但是,有些long值不能表示为doubles.这开始于存在的long9_223_372_036_854_764Long.MAX_VALUE/1000 - 10.第一个更大的(...765)没有double对应物,而下面的数字(...766)确实没有对应物.换句话说,从...764a 开始double,递增尾数的最后一位,...766当转换回时long.