【问题标题】:Is it safe to compare a float and an int in Java?在 Java 中比较 float 和 int 是否安全?
【发布时间】:2017-01-14 18:37:46
【问题描述】:

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

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

根据JLS (5.6.2. Binary Numeric Promotion)如果其中一个参数是float,则另一个参数转换为float再进行比较。 但据我了解,如果转换后的浮点数与原始浮点数相同,则这种比较将返回 true。我们如何保证?

【问题讨论】:

  • 是的。它是安全的。注意这里是double 而不是float - 但同样的规则适用。
  • @MattBall:很好的接球。我显然需要更多的咖啡。

标签: java floating-point


【解决方案1】:

是的,您的具体示例很好,因为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));
    }

}

请注意,与float 不同,double 具有足够宽的尾数来存储每个 32 位 int 值。

但是,有些long 值不能表示为doubles。这开始发生在long9_223_372_036_854_764Long.MAX_VALUE/1000 - 10。更大的数字 (...765) 没有 double 对应物,而以下数字 (...766) 有。换句话说,从...764 开始作为double,递增尾数的最后一位在转换回long 时得到...766

【讨论】:

  • 如果你举个例子那就太棒了
  • @MaksimDmitriev:我添加了一个示例。
  • @NPE 你的答案被用作 dup 目标,所以我添加了一些关于 longdouble 的信息。
猜你喜欢
  • 2011-10-10
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 2011-11-15
  • 2012-10-29
相关资源
最近更新 更多