为什么2 BigDecimal之间的这种比较失败了?

时间:2016-08-30 08:48:09

标签: java bigdecimal

在Java应用程序中,我有一个包含以下情况的单元测试:

BigDecimal rendimentoLordoProvvisiorioExpected = new BigDecimal(2.85000);
BigDecimal rendimentoLordoProvvisiorioDB = null;

rendimentoLordoProvvisiorioDB = pucManager.getRendimentoLordoProvvisorio(date);

assertTrue(rendimentoLordoProvvisiorioExpected.compareTo(rendimentoLordoProvvisiorioDB) == 0);

rendimentoLordoProvvisiorioExpected 变量的值被手动设置为 2.85000 ,获得的值 rendimentoLordoProvvisiorioDB 2.85000

问题是,当我这样做时,比较 assertTrue() JUnit函数

assertTrue(rendimentoLordoProvvisiorioExpected.compareTo(rendimentoLordoProvvisiorioDB) == 0);

它失败,因为 rendimentoLordoProvvisiorioExpected 似乎 2.850000000000000088817841970012523233890533447265625 而不是 2.85000 (已设置)。

为什么呢?如何修改以前的代码以将 rendimentoLordoProvvisiorioExpected 设置为预期值 2.85000

2 个答案:

答案 0 :(得分:6)

使用BigDecimal rendimentoLordoProvvisiorioExpected = new BigDecimal("2.85000");代替BigDecimal rendimentoLordoProvvisiorioExpected = new BigDecimal(2.85000); 你所做的是从双重构建一个BigDecimal,双精度不准确。

答案 1 :(得分:4)

因为您使用浮点值初始化BigDecimal,所以通过使用double调用构造函数。双打是浮点数。使用字符串:

BigDecimal rendimentoLordoProvvisiorioExpected = new BigDecimal("2.85000");

您应该阅读documentation of BigDecimal regarding calling the double version of the constructor

使用BigDecimal时,您将基本的两个浮点数转换为基数为10的浮点数。没有完美的基数两个浮点数表示2.85,最近似似乎是一个接近的数字:

>>> decimal.Decimal(2.85)
Decimal('2.850000000000000088817841970012523233890533447265625')

您应该阅读有关浮点的更多信息,例如What Every Programmer Should Know About Floating-Point Arithmetic