BigDecimal
简介
java.math.BigDecimal
用于解决商业运算上丢失精度的问题,float和double直接运算可能会丢失精度,造成损失。
使用
BigDecimal bd1 = BigDecimal.valueOf(10);
BigDecimal bd2 = BigDecimal.valueOf(3);
System.out.println(bd1.divide(bd2,9, RoundingMode.HALF_DOWN));
可使用的构造方法
BigDecimal(int val)
BigDecimal(String val)
- 静态构造方法
BigDecimal.valueOf
加减乘除
加 add
减 subtract
乘 multiply
除 divide 必须要设置精度,否则可能抛出异常
获取新的精度
BigDecimal
setScale(int newScale, int roundingMode)
注意 会返回一个新的对象,不会改变原有的BigDecimal
精度模式
- UP 远离0,正数+1,负数-1
- DOWN 靠近0,即直接舍弃后面的位
- CEILING 趋于正无穷,正数=UP,负数=DOWN
- FLOOR 趋于负无穷 , 正数=DOWN,负数=UP
- HALF_UP 四舍五入
- HALF_DWON 五舍六入
- HALF_EVEN 当舍弃位!=5,四舍六入,舍弃位==5,看舍弃位前一位,奇数进位,偶数舍弃
- UNNECESSARY 设置位数后必须与原始值完全相等,否则抛出 ArithmeticException
业务常用模式
用户付款金额采取 CEILING
模式,
用户优惠金额采用 FLOOR
模式,避免资损。
注意事项
- 不能使用
BigDecimal(double val)
构造方法,会存在精度丢失的问题,应使用BigDecimal(String val)
或静态构造方法BigDecimal.valueOf
- 计算时 除法必须要指定小数位数和舍入模式
- 根据业务需要 对结果进行精度设置