先说个基础:BigDecimal的max和min方法,直接返回数值较大或较小的那个对象引用。它俩比较的是真实数值大小,不是字符串,精度不同时会自动对齐,而且不接受null参数。

BigDecimal 的 max 和 min 方法,说白了就是直接返回较大的或较小的那个值,省去了手动比较的麻烦。它们是实例方法,调用时传另一个 BigDecimal 对象进去就行。内部比较的是数值大小(不是字符串),结果要么是原对象,要么是参数对象的引用,不会创建新对象。前提是两者精度一致;如果精度不同,它会先对齐精度再比较。
先说说它俩的基本用法
这两个都是 BigDecimal 类的实例方法,语法挺直观的:
a.max(b)返回a和b中数值更大的那个a.min(b)返回a和b中数值更小的那个- 返回值类型还是
BigDecimal,可以链式调用或者赋值给变量
注意,这里比较的是数值大小,不是字符串
max/min 比较的是真实数值大小,跟 compareTo() 一样,不受 scale(小数位数)影响:
new BigDecimal("1.0").max(new BigDecimal("0.999"))结果是1.0(不是按字符串 "1.0" > "0.999" 判定的)new BigDecimal("2").min(new BigDecimal("1.50"))结果是1.50(因为数值 1.5 小于 2)- 底层用的是
compareTo(),所以如果你传 null 进去,直接就是 NullPointerException
一些容易踩的坑,得注意
实际用起来,有些细节容易忽略,结果可能跟预期不一样:
- 别用
equals()判断相等性后再调max/min——max(a, a)肯定返回a,但equals()可能因为 scale 不同返回 false - 如果需要统一 scale 再比较(比如展示一致性),建议先用
setScale(scale, roundingMode)规范化,然后再调max/min - 多个值求最值?可以用 Stream:
Stream.of(a, b, c).max(BigDecimal::compareTo).orElse(null)
null 安全处理这步不能省
max 和 min 不接受 null 参数,运行时直接抛异常。建议提前做校验:
- 用
Objects.requireNonNull(a).max(Objects.requireNonNull(b))明确失败点 - 或者封装个工具方法,比如:
static BigDecimal safeMax(BigDecimal a, BigDecimal b) { return a == null ? b : b == null ? a : a.max(b); } - 业务里常配合 Optional 或默认值使用,避免空指针