为什么 2 BigDecimal 之间的比较失败?
Why this comparision between 2 BigDecimal fail?
进入 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.85000000000000008881784197001252323389053347265625 而不是 2.85000 ).
为什么?如何修改之前的代码以将 rendimentoLordoProvvisiorioExpected 设置为预期值 2.85000?
使用 BigDecimal rendimentoLordoProvvisiorioExpected = new BigDecimal("2.85000");
而不是 BigDecimal rendimentoLordoProvvisiorioExpected = new BigDecimal(2.85000);
您所做的是从双精度构建一个 BigDecimal,而双精度并不精确。
因为您正在使用浮点值初始化 BigDecimal,所以通过使用双精度调用构造函数。双打是浮点数。使用字符串:
BigDecimal rendimentoLordoProvvisiorioExpected = new BigDecimal("2.85000");
你应该阅读 documentation of BigDecimal regarding calling the double
version of the constructor。
当您使用 BigDecimal 时,您是将以 2 为底的浮点数转换为以 10 为底的浮点数。数字 2.85 没有完美的基二浮点表示法,最好的近似值似乎是一个接近于:
的数字
>>> decimal.Decimal(2.85)
Decimal('2.850000000000000088817841970012523233890533447265625')
您应该阅读更多关于浮点数的内容,例如 What Every Programmer Should Know About Floating-Point Arithmetic。
进入 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.85000000000000008881784197001252323389053347265625 而不是 2.85000 ).
为什么?如何修改之前的代码以将 rendimentoLordoProvvisiorioExpected 设置为预期值 2.85000?
使用 BigDecimal rendimentoLordoProvvisiorioExpected = new BigDecimal("2.85000");
而不是 BigDecimal rendimentoLordoProvvisiorioExpected = new BigDecimal(2.85000);
您所做的是从双精度构建一个 BigDecimal,而双精度并不精确。
因为您正在使用浮点值初始化 BigDecimal,所以通过使用双精度调用构造函数。双打是浮点数。使用字符串:
BigDecimal rendimentoLordoProvvisiorioExpected = new BigDecimal("2.85000");
你应该阅读 documentation of BigDecimal regarding calling the double
version of the constructor。
当您使用 BigDecimal 时,您是将以 2 为底的浮点数转换为以 10 为底的浮点数。数字 2.85 没有完美的基二浮点表示法,最好的近似值似乎是一个接近于:
的数字>>> decimal.Decimal(2.85)
Decimal('2.850000000000000088817841970012523233890533447265625')
您应该阅读更多关于浮点数的内容,例如 What Every Programmer Should Know About Floating-Point Arithmetic。