在 Java 中比较数字

新手上路,请多包涵

在 Java 中,所有数值类型都继承自 java.lang.Number。使用如下方法是不是一个好主意:

 public boolean areEqual(Number first, Number second) {
    if (first != null && second != null) {
        return first.equals(second);
    }
}

我担心 double 2.00000 不等于 int 2 的情况。这些是由内置 equals 处理的吗?如果没有,有没有办法在java中编写一个简单的数字比较函数? (外部库如 apache commons 都可以)

原文由 David 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 467
2 个回答

A Double 永远不会 equalsInteger 。此外, doubleDouble

Java 有原始类型和引用类型。 Java 中真正的数字类型不从 Number 扩展,因为它们是原始类型。

您可能需要考虑一个不混合类型的系统,因为这通常会导致隐式/显式转换出现很多问题,可能/可能不会丢失信息等。

相关问题

intInteger

关于 Number 比较:

也可以看看

数字类型 是整数类型和浮点类型。 The integral types are byte , short , int , and long and char .浮点类型是 floatdouble


关于混合类型计算

混合类型计算是 Java Puzzlers 中至少 4 个谜题的主题。

以下是各种摘录:

通常最好避免混合类型的计算 […] 因为它们本质上是令人困惑的 […] 这在条件表达式中最为明显。混合类型比较总是令人困惑,因为系统被迫提升一个操作数以匹配另一个操作数的类型。转换是不可见的,可能不会产生您期望的结果

处方:避免混合整数和浮点类型的计算。首选整数运算而不是浮点运算。

原文由 polygenelubricants 发布,翻译遵循 CC BY-SA 3.0 许可协议

要比较 Java 中的两个数字,您可以使用 compareTo 来自 BigDecimal 。 BigDecimal 可以容纳从 short 到 double 或 BigInteger 的所有内容,因此它是完美的类。

所以你可以尝试写这样的东西:

 public int compareTo(Number n1, Number n2) {
    // ignoring null handling
    BigDecimal b1 = BigDecimal.valueOf(n1.doubleValue());
    BigDecimal b2 = BigDecimal.valueOf(n2.doubleValue());
    return b1.compareTo(b2);
}

这肯定不是关于性能的最佳方法。到目前为止,以下测试有效,至少对于 JDK7:

 assertTrue(compareTo(new Integer(1), new Integer(2)) == -1);
assertTrue(compareTo(new Integer(1), new Double(2.0)) == -1);
assertTrue(compareTo(new Integer(1), new Double(Double.MAX_VALUE)) == -1);
assertTrue(compareTo(new Integer(1), new Double(Double.MIN_VALUE)) == 1);
assertTrue(compareTo(new Integer(1), new Double(1.000001)) == -1);
assertTrue(compareTo(new Integer(1), new Double(1.000)) == 0);
assertTrue(compareTo(new Integer(1), new Double(0.25*4)) == 0);
assertTrue(compareTo(new Integer(1), new AtomicLong(1)) == 0);

原文由 Lian 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题