比较浮点数和这样的整数是否安全?
private static void foo(float n) { if (n >= 1 || n <= 0) { // code } }
根据JLS(5.6.2.二进制数字促销),如果其中一个参数是float
,则另一个float
在比较之前转换为.但据我所知,如果转换后的浮点数与原始浮点数相同,则此类比较将返回true.我们怎样才能确保呢?
是的,你的具体的例子是很好的,因为二者0
并1
可以准确地表示为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)); } }
请注意,与尾数相比float
,double
尾数足以存储每个32位int
值.
但是,有些long
值不能表示为double
s.这开始于存在的long
值9_223_372_036_854_764
是Long.MAX_VALUE/1000 - 10
.第一个更大的(...765
)没有double
对应物,而下面的数字(...766
)确实没有对应物.换句话说,从...764
a 开始double
,递增尾数的最后一位,...766
当转换回时long
.