在 Java 里,BigDecimal 本身不是用来算任意精度整数的首选工具。
BigDecimal 设计目标是任意精度的“十进制小数”,而任意精度整数应该用 BigInteger。
下面分情况说明,并给你正确用法。
✅ 正确做法:用 BigInteger
import java.math.BigInteger;
public class Demo {
public static void main(String[] args) {
BigInteger a = new BigInteger("123456789123456789123456789");
BigInteger b = new BigInteger("987654321987654321987654321");
BigInteger sum = a.add(b);
BigInteger product = a.multiply(b);
System.out.println(sum);
System.out.println(product);
}
}
a.add(b) // 加
a.subtract(b) // 减
a.multiply(b) // 乘
a.divide(b) // 除(必须能整除,否则抛异常)
a.mod(b) // 取模
a.pow(10) // 指数
a.compareTo(b) // 比较
✅ 特点
BigDecimal 好BigDecimal 也可以表示整数,只要不指定小数位。
BigDecimal a = new BigDecimal("123456789123456789123456789");
BigDecimal b = new BigDecimal("987654321987654321987654321");
⚠️ 不要用 new BigDecimal(double)
new BigDecimal(0.1) // ❌ 会有精度问题
new BigDecimal("0.1") // ✅ 正确
BigDecimal sum = a.add(b);
BigDecimal product = a.multiply(b);
BigDecimal 做除法必须指定精度和舍入规则:
BigDecimal result = a.divide(b, 20, RoundingMode.HALF_UP);
如果是整数除法(整除):
BigDecimal result = a.divideToIntegralValue(b);
| 场景 | 推荐 |
|---|---|
| 任意精度整数 | ✅ BigInteger |
| 金额 / 金融计算 | ✅ BigDecimal |
| 整数 + 小数混合 | ✅ BigDecimal |
| 位运算 / 大数算法 | ✅ BigInteger |
❌ 用 double 转 BigDecimal
new BigDecimal(0.1); // 错
✅ 用字符串
new BigDecimal("0.1");
❌ 不指定舍入直接 divide
a.divide(b); // 可能抛 ArithmeticException
✅ 指定
a.divide(b, 10, RoundingMode.HALF_UP);
✅ 任意精度整数 → 用
BigInteger
✅ 需要小数或金额 → 用BigDecimal
如果你有具体场景(比如阶乘、幂运算、金额计算、进制转换),我可以给你更针对性的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。