为什么有些数字在存储为浮点数时会失去准确性?
例如,十进制数9.2可以精确地表示为两个十进制整数(92/10)的比率,两者都可以用二进制(0b1011100/0b1010)精确表示.但是,存储为浮点数的相同比率永远不会完全等于9.2:
32-bit "single precision" float: 9.19999980926513671875
64-bit "double precision" float: 9.199999999999999289457264239899814128875732421875
Run Code Online (Sandbox Code Playgroud)
这样一个看似简单的数字如何在64位内存中表达"太大" ?
根据JavaDoc for BigDecimal,该compareTo功能不考虑比较期间的比例.
现在我有一个看起来像这样的测试用例:
BigDecimal result = callSomeService(foo);
assertTrue(result.compareTo(new BigDecimal(0.7)) == 0); //this does not work
assertTrue(result.equals(new BigDecimal(0.7).setScale(10, BigDecimal.ROUND_HALF_UP))); //this works
Run Code Online (Sandbox Code Playgroud)
我期望函数返回的值是,0.7并且具有10的标度.打印该值显示预期结果.但是这个compareTo()功能似乎并没有像我认为的那样工作.
这里发生了什么?