java原生算术运算符无法直接实现大数精确运算,必须使用biginteger(整数)和bigdecimal(小数);二者均需字符串构造,运算通过方法调用,且bigdecimal除法须指定精度与舍入模式。

Java 原生算术运算符(+、-、*、/、%)**无法直接实现大数精确运算**,因为它们作用于基本类型(如 int、long、double),存在位数限制和浮点精度丢失问题。要进行任意精度的整数或小数精确运算,必须使用 Java 标准库提供的高精度类:BigInteger(整数)和 BigDecimal(带小数的十进制数)。
用 BigInteger 做大整数精确运算
BigInteger 用于不受限大小的整数运算,所有操作都是精确的,无溢出风险。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 不能用
+、-等运算符直接计算,必须调用方法:如add()、subtract()、multiply()、divide()、mod() - 构造方式:从字符串或
long创建(避免int/long字面量本身已溢出)
✓ 推荐:new BigInteger("123456789012345678901234567890")
✗ 避免:new BigInteger(12345678901234567890L)(该字面量在 long 范围外,编译报错) - 除法需注意:
divide()要求整除,否则抛ArithmeticException;如需商余分离,用divideAndRemainder()返回BigInteger[2]
用 BigDecimal 做高精度小数运算
BigDecimal 用于需要精确十进制计算的场景(如金融计算),避免 double 的二进制浮点误差。
- **永远优先用字符串构造**:
new BigDecimal("0.1")✅;new BigDecimal(0.1)❌(后者会继承double的 0.10000000000000000555... 误差) - 加减乘除都通过方法调用:
add()、subtract()、multiply()、divide() -
divide()必须指定精度和舍入模式(因十进制除法可能无限循环):bigDec1.divide(bigDec2, 10, RoundingMode.HALF_UP) - 推荐设置统一的标度(scale)和舍入策略,例如货币计算常用
setScale(2, HALF_EVEN)
常见误区与替代方案
- 误用基本类型运算后再转
BigInteger/BigDecimal:精度已在前期丢失,不可逆 - 混用
double和BigDecimal构造:如new BigDecimal(1.0 / 3.0)→ 结果是近似值,应写new BigDecimal("1").divide(new BigDecimal("3"), 10, HALF_UP) - 性能敏感场景慎用:
BigInteger和BigDecimal是对象,运算开销远大于基本类型;仅在“必须精确”时使用 - 如需更灵活的大数支持(如复数、符号计算),可考虑第三方库如 Apache Commons Math 或 JScience,但标准需求
java.math已足够
一个典型安全示例(金融加法)
// 正确:字符串输入 → 精确运算 → 固定两位小数
BigDecimal a = new BigDecimal("19.99");<br>
BigDecimal b = new BigDecimal("0.01");<br>
BigDecimal sum = a.add(b).setScale(2, RoundingMode.HALF_EVEN); // 结果 "20.00"Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










