java - 为什么 JUnitassertEquals(-0.0, 0.0) 失败?

标签 java junit

我正在 Java SE 11 中使用 JUnit 5,并发现assertEquals(-0.0,0.0) 失败。这是为什么? Java 本身对“-0.== 0.”非常满意。示例代码如下。

double  dVar1   = 0;
double  dVar2   = -dVar1;
System.out.println( dVar1 == dVar2 ); // true
System.out.println( -0. == 0. );      // true
assertEquals( dVar1, dVar2, .00001 ); // passes
assertEquals( 0.0, -0.0, .0001 );     // passes
assertEquals( 0.0, -0.0 );            // fails
assertEquals( dVar1, dVar2 );         // fails

最佳答案

Java 对于 -0 和 0 没有问题。 但在assertEquals方法中使用Double类中的此方法将params转换为longBits 并且返回的值不一样。

 public static long doubleToLongBits(double value) {
        long result = doubleToRawLongBits(value);
        // Check for NaN based on values of bit fields, maximum
        // exponent and nonzero significand.
        if ( ((result & DoubleConsts.EXP_BIT_MASK) ==
              DoubleConsts.EXP_BIT_MASK) &&
             (result & DoubleConsts.SIGNIF_BIT_MASK) != 0L)
            result = 0x7ff8000000000000L;
        return result;
    }

在你的情况下,你必须使用第一个基于数学运算的assertEquals(double Expected, Double Actual, Double Delta):return doublesAreEqual(value1, value2) || Math.abs(值1 - 值2) <= delta

关于java - 为什么 JUnitassertEquals(-0.0, 0.0) 失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64976217/

相关文章:

java - 如何让 JUnit 保持安静?

java - 如何使用 Mockito 验证 Junit 测试用例中的 logger.error(String message, Throwable t)

Java——字符串转换

java - Android Studio 无法构建

html - 如何在 Java Swing 的 JPanel 中呈现基本的 HTML 标记?

java - java.lang.String 为什么不验证编码?

junit - 论据不同!通缉 : Actual invocation has different arguments:

java - JUnit 异常处理测试

java - 根据生产或测试环境在 Eclipse 中使用不同的 JPA.persistence.xml

java - sphinx for Java API的一些问题