在Java中比较浮点数和整数是否安全?
比较浮点数和这样的整数是否安全?
private static void foo(float n) { if (n >= 1 || n <= 0) {
// code
}
}
根据JLS(5.6.2。二进制数值提升),如果其中一个参数为float
,则另一个参数将转换为float
比较之前的值。但是据我了解,如果转换后的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
a
开始,double
将...766
转换回时的尾数的最后一位递增long
。
以上是 在Java中比较浮点数和整数是否安全? 的全部内容, 来源链接: utcz.com/qa/415282.html