比较浮点数和这样的整数是否安全?
private static void foo(float n) {
if (n >= 1 || n <= 0) {
// code
}
}
根据JLS (5.6.2. Binary Numeric Promotion),如果其中一个参数为float
,则另一个参数在比较之前转换为float
。
但据我所知,如果转换后的浮点数与原始浮点数相同,则此类比较将返回true。我们怎样才能确保它?
答案 0 :(得分:6)
是的,您的具体示例很好,因为0
和1
都可以准确地表示为float
。
请注意,一般情况并非如此:有许多大的int
值无法完全表示为float
。例如,以下打印出true
(Ideone),即使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
。这开始于long
值9_223_372_036_854_764
Long.MAX_VALUE/1000 - 10
。第一个更大(...765
)没有double
对应,而以下数字(...766
)确实如此。换句话说,从...764
作为double
开始,当转换回...766
时,递增尾数的最后一位会给出long
。