如何测试 BigDecimal 值
How to test BigDecimal values
我正在尝试对一些产生 BigDecimal 输出的方法进行单元测试,但我对变化的精度感到很困惑:
assertEquals(BigDecimal.valueOf(20), result);
我最近从使用构造函数(new BigDecimal(value)
到使用 valueOf(value)
)创建 BigDecimal 值切换到使用 valueOf(value)
)并且我的测试有问题:
Expected :20
Actual :20.00
设置 BigDecimal.valueOf(20.00)
没有帮助所以我的问题是,测试这些浮点 BigDecimal 实例的正确方法是什么?我的大多数测试用例在浮点数之后都会有零。
除了技术 new BigDecimal("20.00")
与
new BigDecimal(20.00)
(因为触发 "string parsing" 的“”),我建议你看看 hamcrest。
当您需要测试 "equality + delta" 时,该框架甚至提供了 BigDecimalCloseTo,可以像这样使用:
assertThat(new BigDecimal("1.03"), is(closeTo(new BigDecimal("1.0"), new BigDecimal("0.03"))))
问题是 BigDecimal.equals
遵循这条规则:
Compares this BigDecimal
with the specified Object
for equality.
Unlike compareTo
, this method considers two BigDecimal
objects
equal only if they are equal in value and scale (thus 2.0 is not equal
to 2.00 when compared by this method).
并且20
和20.00
不具有相同的比例。
您需要使用其中之一
new BigDecimal("20.00")
或
BigDecimal.valueOf(20).setScale(2)
或者,如果您喜欢更深奥的选择
BigDecimal.valueof(2000, 2)
BigDecimal.valueOf(20.00)
的问题在于遵循 BigDecimal.valueOf(double)
的规则,这导致 BigDecimal 为 20.0
(即比例 1),并且 - 略有不同 - new BigDecimal(20.00)
将导致 BigDecimal
的 20
(比例 0)。
我正在尝试对一些产生 BigDecimal 输出的方法进行单元测试,但我对变化的精度感到很困惑:
assertEquals(BigDecimal.valueOf(20), result);
我最近从使用构造函数(new BigDecimal(value)
到使用 valueOf(value)
)创建 BigDecimal 值切换到使用 valueOf(value)
)并且我的测试有问题:
Expected :20
Actual :20.00
设置 BigDecimal.valueOf(20.00)
没有帮助所以我的问题是,测试这些浮点 BigDecimal 实例的正确方法是什么?我的大多数测试用例在浮点数之后都会有零。
除了技术 new BigDecimal("20.00")
与
new BigDecimal(20.00)
(因为触发 "string parsing" 的“”),我建议你看看 hamcrest。
当您需要测试 "equality + delta" 时,该框架甚至提供了 BigDecimalCloseTo,可以像这样使用:
assertThat(new BigDecimal("1.03"), is(closeTo(new BigDecimal("1.0"), new BigDecimal("0.03"))))
问题是 BigDecimal.equals
遵循这条规则:
Compares this
BigDecimal
with the specifiedObject
for equality. UnlikecompareTo
, this method considers twoBigDecimal
objects equal only if they are equal in value and scale (thus 2.0 is not equal to 2.00 when compared by this method).
并且20
和20.00
不具有相同的比例。
您需要使用其中之一
new BigDecimal("20.00")
或
BigDecimal.valueOf(20).setScale(2)
或者,如果您喜欢更深奥的选择
BigDecimal.valueof(2000, 2)
BigDecimal.valueOf(20.00)
的问题在于遵循 BigDecimal.valueOf(double)
的规则,这导致 BigDecimal 为 20.0
(即比例 1),并且 - 略有不同 - new BigDecimal(20.00)
将导致 BigDecimal
的 20
(比例 0)。