
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。对于Double类型的运算,通常使用此类处理,来有效避免精度问题。
正文
基本运算
加减乘除方法返回的是BigDecimal型数据:.add(),.subtract(),.multiply(),.divide();

比较大小
compareTo方法返回的是一个int型数据:-1 小于; 0 等于; 1 大于。

舍位
.setScale(scale,roundingMode)方法中:scale表示精确位数,roundingMode表示舍入模式;

格式化
NumberFormat(),DecimalFormat():可以通过自定义方式,限制输出数据的类型和精度,就像定义时间的Formate方法一样;

科学计数
.toPlainString()方法返回String类型数据:可将Excel表格中导入的科学计数法轻松地转换成十进制数;

注意
BigDecimal的加减乘除操作,其实最终返回的都是一个新的BigDecimal对象,因为BigDecimal都是不可变的的(BigInteger同理);
如果用BigDecimal做除法,一定要在divide()方法中传递第二个参数scale,定义精确到小数点后几位,否则在不整除的情况下,结果是无限循环小数时,就会抛出ArithmeticException异常。
小结
- 凡是涉及到精确计算的地方,要使用BigDecimal;
- 建议每个项目中,都要提前准备一个BigDecimal计算的utils类;
- 尽量使用参数类型为String的构造函数,避免计算误差(即使是Double数据,其实也是先被toString处理了);
- BigDecimal是不可变的,在进行每一步运算时,都会产生一个新的对象。