在Java中比较float和int安全吗?

在Java中比较float和int安全吗?,java,floating-point,Java,Floating Point,这样比较浮点和整数安全吗 private static void foo(float n) { if (n >= 1 || n <= 0) { // code } } 私有静态void foo(float n){ 如果(n>=1 | | n是,那么您的具体示例就可以了,因为0和1都可以精确地表示为浮点 请注意,通常情况下这是不正确的:有许多大的int值不能精确地表示为float。例如,以下打印出true(),即使2_000_000_001不等于2_0

这样比较浮点和整数安全吗

private static void foo(float n) {
    if (n >= 1 || n <= 0) {
      // code 
    } 
}
私有静态void foo(float n){

如果(n>=1 | | n是,那么您的具体示例就可以了,因为
0
1
都可以精确地表示为
浮点

请注意,通常情况下这是不正确的:有许多大的
int
值不能精确地表示为
float
。例如,以下打印出
true
(),即使2_000_000_001不等于2_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
s。这种情况从
long
9_223; u 372_036_854_764
开始出现,即
long.MAX_值/1000-10
。较大的一号(
…765
)没有
double
对应项,而以下数字(
…766
)是的。换句话说,从
…764
开始,作为
双精度
,当转换回
长的
时,增加尾数的最后一位,得到
…766
。是的。这是安全的。注意这里是
双精度
而不是
浮点数
,但同样的规则适用。@MattBall:接得好。我显然是这样做的需要更多的咖啡。如果你能给我一杯咖啡那就太棒了example@MaksimDmitriev:我添加了一个示例。@NPE您的答案被用作dup目标,因此我添加了一些关于
long
vs
double
的信息。