java - 在 Java 中比较 float 和 int 是否安全?

标签 java floating-point

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

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

根据JLS (5.6.2. Binary Numeric Promotion)如果参数之一是 float ,另一个转换为 float对比前。
但据我所知,如果转换后的浮点数与原始浮点数二进制相同,则这种比较将返回 true。我们如何确保它?

最佳答案

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

但是,还有long不能表示为 double 的值s。这开始发生在 long值(value) 9_223_372_036_854_764这是 Long.MAX_VALUE/1000 - 10 .大一号 ( ...765 ) 没有 double对应,而下面的数字 ( ...766 ) 是。换句话说,从 ...764 开始作为 double , 增加尾数的最后一位给出 ...766当转换回 long .

关于java - 在 Java 中比较 float 和 int 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41653576/

相关文章:

Java 客户端连接错误 : ChangeCipherSpec message sequence violation

java - 如何从 Renderscript 内核中检索结构

java - 将 ArrayList 转换为包含不同长度数组的二维数组

java - Sonarqube sonar way profile 和 sonarqube java rules repository 之间的区别

floating-point - Verilog 中的复杂浮点时序逻辑

java - 为什么当我保存 txt 文件时 eclipse 就开始构建所有内容?

math - float 学有问题吗?

c - printf和co如何区分float和double

c++ - 从 double 转换为 float 时检测精度损失

objective-c - 检查浮点值是否为整数