由于浮点数据类型float,double在计算中的不确定性,在需要精确计算的时候,java提供一个BigDecimal,使用 BigDecimal 来定义浮点数的值,再进行浮点数的运算操作。
- BigDecimal a = new BigDecimal("1.0");
- BigDecimal b = new BigDecimal("0.9");
- System.out.println(a.compareTo(b));// 1
- BigDecimal m = new BigDecimal("1.255433");
- BigDecimal n = m.setScale(3,BigDecimal.ROUND_HALF_DOWN);
注意点:
1、使用string传参构造bigDecimal数据,使用浮点数double会有丢失精度的风险
2、执行计算过程中必须考虑string为空,null的情况,
3、执行计算过程中一旦出现divide除法操作,还必须判断:
除数不为零(会报错除数不能为0)
是否除尽(不指定,会报错Non-terminating decimal expansion)
保留小数位数长度(可能超出数据存储范围导致报错)
- gasConsumeIndex.setQoq((new BigDecimal(gasConsumeIndex.getIndexOfValue())
- .subtract(new BigDecimal(gasConsumeIndex.getLastMonthValue()))
- .divide(new BigDecimal(gasConsumeIndex.getLastMonthValue()),BigDecimal.ROUND_CEILING))
- .multiply(new BigDecimal(100))
- .setScale(2,BigDecimal.ROUND_HALF_UP)
- .toString()+"%");
4、bigDecimail判断是否为0 务必使用,使用equale会因为精度比较失败
compareTo(BigDecimal.ZERO)