在Java中比较浮点数和整数是否安全?

比较浮点数和这样的整数是否安全?

private static void foo(float n) {

if (n >= 1 || n <= 0) {

// code

}

}

根据JLS(5.6.2。二进制数值提升),如果其中一个参数为float,则另一个参数将转换为float比较之前的值。但是据我了解,如果转换后的float与原始float二进制相同,则这样的比较将返回true。我们如何确保呢?

回答:

是的,您的具体示例很好,因为01都可以精确地表示为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));

}

}

请注意,与不同floatdouble尾数足够宽以存储每个32位int值。

但是,有些long值不能表示为doubles。这开始于存在的long9_223_372_036_854_764Long.MAX_VALUE/1000

- 10。较大的数字(...765)没有double对应物,而后面的数字(...766)有对应物。换句话说,从...764a

开始,double...766转换回时的尾数的最后一位递增long

以上是 在Java中比较浮点数和整数是否安全? 的全部内容, 来源链接: utcz.com/qa/415282.html

回到顶部