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

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

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

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

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

请注意,这通常不正确:有许多大的int值不能完全表示为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)); } } 

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

但是,有一些long值不能表示为double s。 这开始发生在long9_223_372_036_854_764 ,即Long.MAX_VALUE/1000 - 10 。 第一大( ...765 )没有double对应,而下面的数字( ...766 )确实如此。 换句话说,从...764开始作为一个double ,递增尾数的最后一位给出...766转换回long