- 常用构造方法
BigDecimal(double val);
BigDecimal(int val);
BigDecimal(long val);
BigDecimal(String val);
注意事项:当构造方法的参数时是double类型时,会出现精度损失问题,如:
public class BigDecimalTest { public static void main(String[] args){ double d = 301353.05; BigDecimal decimal = new BigDecimal(d); System.out.println(decimal); System.out.println(decimal.setScale(1, RoundingMode.HALF_UP)); } }
输出结果:
301353.0499999999883584678173065185546875
301353.0解决方案之一:将对应的double类型数据转换成string类型,如:
public class BigDecimalTest { public static void main(String[] args){ double d = 301353.05; System.out.println(new BigDecimal(new Double(d).toString())); System.out.println(new BigDecimal("301353.05")); System.out.println(new BigDecimal("301353.895898895455898954895989")); } }
输出结果:
301353.05
301353.05
301353.895898895455898954895989
所以,如果需要保证精度,最好是不要使用BigDecimal的double参数的构造函数,因为存在损失double参数精度的可能,最好是使用BigDecimal的String参数的构造函数。
2.做加、减、乘、除操作
//加
BigDecimal add(BigDecimal augend);
//减
BigDecimal subtract(BigDecimal subtrahend)
//乘
BigDecimal multiply(BigDecimal multiplicand)
//除
BigDecimal divide(BigDecimal divisor);
BigDecimal divide(BigDecimal divisor, int scale, int roundingMode);用一个BigDecimal对象
除以divisor后的结果,并且要求这个结果保留有scale个小数位,roundingMode表示的就是保留模式是什么
3.设置精度问题
BigDecimal.setScale()方法用于格式化小数点
setScale(1)表示保留一位小数,默认用四舍五入方式
setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3
setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4
setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4
setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍
scale(),返回当前BigDecimal的精度