主要观点:在 Java 中使用浮点数时,开发者常使用 BigDecimal 类进行精确计算,但 BigDecimal 的 equals()方法使用不当会导致意外结果,比较 BigDecimal 可能比想象中困难。
关键信息:
- BigDecimal 是用于表示任意精度浮点数的类,由无标度值(BigInteger)和标度(int)组成。
- equals()方法实际比较的是无标度值和标度,而非数值等价,不同标度的 BigDecimal 即使数值相同,equals()方法也可能返回 false。
- 避免该陷阱可使用 compareTo()方法或通过 stripTrailingZeros()方法归一化 BigDecimal 后再使用 equals()方法。
重要细节: - 以创建 BigDecimal 对象为例,如 BigDecimal zero1 = new BigDecimal("0"),BigDecimal zero2 = new BigDecimal("0.0"),它们虽数值相同但标度不同,equals()方法返回 false。
- 使用 compareTo()方法可比较数值大小,如 BigDecimal value1 = new BigDecimal("1.23"),BigDecimal value2 = new BigDecimal("1.230"),value1.compareTo(value2)输出 0 表示数值相等。
- 使用 stripTrailingZeros()方法归一化后,如 BigDecimal zero1 = new BigDecimal("0").stripTrailingZeros(),BigDecimal zero2 = new BigDecimal("0.0").stripTrailingZeros(),它们的 scale 相同,equals()方法返回 true。 最后提到可关注Follow获取更多 Java 内容,#java 可用于搜索相关 Java 博客。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。