【问题标题】:Is comparing double values using == deterministic正在使用 == 确定性比较双精度值
【发布时间】:2017-08-25 09:18:18
【问题描述】:
import java.math.BigDecimal;

public class HelloWorld{

     public static void main(String []args){
        BigDecimal previousOperationAmount = new BigDecimal(1149.35);
        Double requestedAmount = 1149.35;

        if (requestedAmount != previousOperationAmount.doubleValue()) {
            System.out.println("Hello 1");
        }

        if(!requestedAmount.equals(previousOperationAmount.doubleValue())) {
            System.out.println("Hello 2");
        }
     }
}

有两种方法可以比较双精度值.. 一种是使用 != 运算符,一种是使用 .equals 运算符。我知道 .equals 是更好的比较方式。但是在这里, != 比较也没有给出任何错误。

可以使用 != 比较双值吗? != 检查双值是否具有确定性?

【问题讨论】:

  • 从技术上讲,是也不是。是的,可以将double(但不是Double,因为具有相同值的两个Double 对象与Double 对象不同)与!= 进行比较。但是由于double 不是绝对精确的,所以您会遇到很多麻烦,例如,如果将 1.00000000000000000001 与 1.0 进行比较(这很容易发生)。因此,更好的方法包括,例如,使用 Math.abs( double1 - double2 ) > eps 之类的东西(对于有用的 eps)。
  • != 是确定性的,就像equals 一样。你为什么不检查Double.equals 的文档来找出答案? docs.oracle.com/javase/8/docs/api/java/lang/…
  • @FlorianSchaetz 你的意思是Math.abs( double1 - double2 ) <= eps 在检查相等性时,对吧?否则,5.014.13 将通过检查任何小于1.0eps
  • @Shark 因为问题是关于!=,所以我使用了>。对于相等,正确,您应该检查<<= eps。在这种情况下,假设 eps 为 1E-6,我们将有 |5.01 - 4.13| > 1E-6,即 true(因此两者在此 eps 方面不相等)。如果你想测试是否相等,你必须切换比较,true。
  • 哦,别忘了这里也涉及到一些自动拆箱功能,这使整个事情更加复杂;-)

标签: java


【解决方案1】:

documentation中明确指出了区别:

请注意,在大多数情况下,对于 Doubled1d2d1.equals(d2) 的值为 true 当且仅当

d1.doubleValue() == d2.doubleValue()

也有值true。但是,有两个例外:

  • 如果d1d2 都表示Double.NaN,则equals 方法返回true,即使Double.NaN==Double.NaN 具有 值false
  • 如果d1代表+0.0,而d2代表-0.0, 反之亦然,相等测试的值为false,即使 +0.0==-0.0 的值为 true

【讨论】:

  • BigDecimal 自动拆箱怎么样。会不会有什么影响。你能考虑一下吗
  • BigDecimal 没有自动拆箱之类的东西。
猜你喜欢
  • 1970-01-01
  • 2021-08-13
  • 2018-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多