为什么新的 BigDecimal(“0.015”).compareTo(new BigDecimal(0.015))返回 -1?

2022-09-03 09:35:19

为什么返回 -1?如果我期望这两者是相等的,有没有另一种方法可以比较它们?new BigDecimal("0.015").compareTo(new BigDecimal(0.015))


答案 1

由于浮点算术的不精确性,它们并不完全相等

System.out.println(new BigDecimal(0.015));

显示

0.01499999999999999944488848768742172978818416595458984375

答案 2

为了扩展@Reimeus的答案,BigDecimal 的各种构造函数接受不同类型的输入。浮点构造函数以浮点作为输入,并且由于浮点/双精度的存储方式的限制,这些只能准确存储 2 的幂值。

因此,例如,2⁻²或0.25可以精确表示。0.875 是 (2⁻¹ + 2⁻² + 2⁻³),因此也可以准确表示。只要该数字可以用幂的总和来表示,其中上限和下部的幂相差不超过53,那么该数字就可以被精确地表示。绝大多数数字都不符合这种模式!

特别是,0.15不是二的幂,也不是二的幂之和,因此表示不准确。

另一方面,字符串构造函数通过在内部使用不同的格式来存储数字,从而准确地存储它。因此,当您比较两者时,它们会比较为不同。


推荐