双重小于零的双重投射

时间:2008-10-22 06:20:15

标签: java syntax

Double out = otherTypes.someMethod(c, c2);
assertEquals((Double)-1.0D, out);

我收到错误“Double无法解析”(assertEquals中的Double),除了提取变量之外,还有什么方法可以解决它吗?

这是Java中的错误还是非常有用的功能无法修复?

5 个答案:

答案 0 :(得分:6)

一个重要的注意事项:由于浮点数的工作方式,您不应该直接比较两个双精度(或通常说的浮点数)的相等性,如果它们的差异在指定的增量范围内,请始终进行比较:abs(double1 - double2) < delta

JUnit有一个assertEquals(double expected, double actual, double delta)方法可以做到这一点。也就是说,你应该使用像

这样的东西
assertEquals(-1.0d, (double) out, 0.000001d)

代码。

您可以在Brian Goetz的文章中找到有关浮点数的技巧和陷阱的更多信息:"Where's your point?"

答案 1 :(得分:2)

我的变化类似于jjnguy的

assertEquals(Double.valueOf(-1.0D), out)

这个最大的区别是Double.valueOf可以返回缓存副本而不必创建新对象。

答案 2 :(得分:1)

要将-1.0D转换为Double,我们通常使用Double.valueOf(-1.0D)的最佳方式。 Double类缓存对valueOf的调用结果,这样您就不会总是在堆上创建新对象。但更好的是转换成双倍,这是更便宜。使用out.doubleValue()将值设为double。唯一需要注意的是out可能是null,这是一个单独的案例,可能值得自行检测。

在以这种方式测试直接相等时,您还应该警惕浮点不准确性。理论上相等的两个数字可能没有完全相等的表示,因为大多数浮点运算都会引入一些舍入误差。在这种情况下可以使用的简单解决方案是测试差异是否小于某个增量:

assertTrue(Math.abs(-1.0D-out.doubleValue()) < delta);

你也可以使用JUnit的便捷方法来做到这一点:

assertEquals(-1.0d, out.doubleValue(), delta);

使用非常小的delta值,例如10E-10,或适合您的应用程序的值。在最一般的情况下,如果您不知道要比较的值的范围,则需要将delta乘以每个数字的相对大小,如下所示:

double tDelta = delta*(Math.abs(-1.0D)+Math.abs(out.doubleValue()));
assertEquals(-1.0d, out.doubleValue(), tDelta);

如果您要比较非常大的数字,您希望允许的delta更大,如果您要比较非常小的数字,您希望允许的delta更小。但是对于你的情况,你事先知道你的一个参数,所以你可以硬编码delta。

答案 3 :(得分:0)

我建议您何时检查两个双打是否完全相同:

assertEquals(Double.doubleToLongBits(-1.0), Double.doubleToLongBits(out));

答案 4 :(得分:0)

这通过编译器:

assertEquals(Double.class.cast(-1.0D), out);
相关问题