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
  • 计算时 除法必须要指定小数位数和舍入模式
  • 根据业务需要 对结果进行精度设置
Last Updated:
Contributors: mcs