有几个例子:
double a = 100.00;
double b = 99.33;
double res = b-a; //Получится -0.67 OK
double x = 100.00;
double y = 99.95;
double res2 = y-x; // Получится -0.04 ???
问题是,为什么在第二个例子中丢失了 0.01?这怎么能解决。我尝试了 BigDecimal(ROUND_CEILING/FLOOR),但在这种情况下,第一个选项被认为是不正确的。
不需要舍弃小数位
浮点原语不保证计算中的数学准确性,因为它们在内存中的表示和对它们的操作的特殊性(顺便说一下,因此,您不应该检查这些值是否完全相等,但您需要检查它们是否落入区间)。如果需要数学精度,则应使用 BigDecimal 类的对象。
“结果是 -0.04” - 仅当您丢弃从小数点后第三位开始的所有内容时。