bigdecimal的max和min方法直接返回数值较大或较小的对象引用,基于compareto()比较真实数值大小而非字符串,精度不同时自动对齐,不接受null参数。

BigDecimal 的 max 和 min 方法直接返回较大或较小的值,无需手动比较。它们是实例方法,调用时传入另一个 BigDecimal 对象,内部基于数值大小(而非字符串)比较,结果是原对象或参数对象的引用(不创建新对象),前提是两者精度一致;若精度不同,会先做精度对齐再比较。
max 和 min 的基本用法
两者都是 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 或默认值使用,避免空指针
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











