在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值不能表示为doubles。这开始于存在的long值9_223_372_036_854_764是Long.MAX_VALUE/1000
- 10。较大的数字(...765)没有double对应物,而后面的数字(...766)有对应物。换句话说,从...764a
开始,double将...766转换回时的尾数的最后一位递增long。
以上是 在Java中比较浮点数和整数是否安全? 的全部内容, 来源链接: utcz.com/qa/415282.html
