assertequals(-0.0,0.0)会失败?

7fyelxc5  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(464)

我在JavaSE11中使用JUnit5,发现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
axkjgtzd

axkjgtzd1#

java对-0和0没有问题。但是在assertequals方法中,使用这个来自double类的方法将参数转换为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;
    }

在您的例子中,您必须使用基于数学运算的first assertequals(double expected,double actual,double delta):return doublesareequal(value1,value2)| | math.abs(value1-value2)<=delta

相关问题