在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 ?
答案 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。