在Java中比较float和int是否安全?
比较浮点数和这样的整数是否安全?
private static void foo(float n) { if (n >= 1 || n <= 0) { // code } }
根据JLS(5.6.2。二进制数字促销),如果其中一个参数是float
,则另一个参数在比较之前转换为float
。 但据我所知,如果转换后的浮点数与原始浮点数相同,则这种比较将返回true。 我们如何确保它?
是的,您的具体示例很好,因为0
和1
都可以精确地表示为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。 这开始发生在long
值9_223_372_036_854_764
,即Long.MAX_VALUE/1000 - 10
。 第一大( ...765
)没有double
对应,而下面的数字( ...766
)确实如此。 换句话说,从...764
开始作为一个double
,递增尾数的最后一位给出...766
转换回long
。