如何测试BigDecimal值

时间:2018-08-01 09:03:25

标签: java unit-testing junit bigdecimal

我正在尝试对产生BigDecimal输出的某些方法进行单元测试,但是我对变化的前提感到很困惑:

assertEquals(BigDecimal.valueOf(20), result);

我最近从使用构造函数(new BigDecimal(value)创建BigDecimal值切换为使用valueOf(value)),而我的测试却在抱怨:

Expected :20
Actual   :20.00

设置BigDecimal.valueOf(20.00)并没有帮助,所以我的问题是,测试这些浮点BigDecimal实例的正确方法是什么?我的大多数测试用例在浮点之后都为零。

2 个答案:

答案 0 :(得分:5)

问题在于BigDecimal.equals遵循以下规则:

  

将此BigDecimal与指定的Object比较是否相等。   与compareTo不同,此方法考虑两个BigDecimal对象   仅当它们的值和标度相等时才相等(因此2.0不相等)   以此方法比较时为2.00)。

2020.00的比例尺不同。

您需要使用其中一个

new BigDecimal("20.00")

BigDecimal.valueOf(20).setScale(2)

或者,如果您喜欢更多深奥的选择

BigDecimal.valueof(2000, 2)

BigDecimal.valueOf(20.00)的问题在于,遵循BigDecimal.valueOf(double)的规则,这会导致20.0的BigDecimal(即小数位数1),并且-略有不同-{{1 }}将产生new BigDecimal(20.00)的{​​{1}}(小数位数为0)。

答案 1 :(得分:2)

除技术性new BigDecimal("20.00")以外, new BigDecimal(20.00)(由于触发了“字符串解析”的“”),建议您考虑一下hamcrest。

当您需要测试“平等+增量”时,该框架甚至可以提供BigDecimalCloseTo,以供使用:

assertThat(new BigDecimal("1.03"), is(closeTo(new BigDecimal("1.0"), new BigDecimal("0.03"))))