双值assertEquals的delta或epsilon参数的java含义
我有一个关于JUnit assertEquals
的问题,需要测试double
值。阅读API doc我可以看到:
@Deprecated public static void assertEquals(double expected, double actual)
Deprecated. Use
assertEquals(double expected, double actual, double delta)
instead.
(注意:在较旧的文档版本中,delta参数称为epsilon)
delta
(或epsilon
)参数是什么意思
# 1 楼答案
请注意,如果你不做数学,断言精确的浮点值没有错。例如:
在本例中,您需要确保它确实是
MIN_VALUE
,而不是零或-MIN_VALUE
或MIN_NORMAL
或其他非常小的值。你可以说但这会给你一个反对的警告。为了避免这种情况,您可以调用
assertEquals(Object, Object)
:如果你真的想看起来聪明点:
或者你也可以使用Hamcrest流畅的风格断言:
但是,如果你检查的值确实来自于做一些数学运算,那么使用ε
# 2 楼答案
ε是两个数字可以关闭的值。所以只要
Math.abs(expected - actual) <= epsilon
它就会断言为真# 3 楼答案
浮点计算是不精确的——通常存在舍入误差,以及由于表示而产生的误差。(例如,0.1不能用二进制浮点精确表示。)
因此,直接比较两个浮点值是否相等通常不是一个好主意,因为它们可能会有少量差异,这取决于它们的计算方式
在JUnit javadocs中被称为“delta”,它描述了你可以容忍的数值差异量,它们仍然被认为是相等的。此值的大小完全取决于要比较的值。比较双精度时,我通常使用预期值除以10^6