一、BigDecimal类介绍
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。
二、常用方法法以及注意事项
1.构造函数
构造函数应该使用String类型
BigDecimal aDouble = new BigDecimal(1.22);
System.out.println("构造函数使用double: " + aDouble);
BigDecimal aString = new BigDecimal("1.22");
System.out.println("构造函数使用String: " + aString);
打印结果:
构造函数使用double: 1.2199999999999999733546474089962430298328399658203125
构造函数使用String: 1.22
2.除法注意设置精度
//除法必须设置经度否则会有异常
//ArithmeticException:Non-terminating decimal expansion; no exact representable decimal //result
System.out.println(new BigDecimal(2).divide(new BigDecimal(3)));
3.格式化数字
DecimalFormat类
注意:默认的的RoundingMode
//0与#的区别:0为此位置不足用0补齐 #为此位置不足就空着
BigDecimal a = new BigDecimal("1.23");
System.out.println(new DecimalFormat("0.000").format(a));
System.out.println(new DecimalFormat("#.###").format(a));
a = new BigDecimal("3.145");
DecimalFormat df = new DecimalFormat("###.00");
System.out.println(df.format(a));
df.setRoundingMode(RoundingMode.HALF_UP);//默认是 RoundingMode.HALF_EVEN("银行家舍入法)
System.out.println(df.format(a));
打印结果
1.230
1.23
3.14
3.15
4.业务上舍弃导致的在保留精度上少1的错误
我们都知道,在进行舍弃或者进位的时候,我们其实是放弃了属于数字的一部分精度上的数字,很显然,我们如果要是做按照比例分钱或者是平账一类的系统的时候会出现一些短账的错误。比如:将10的优惠平均分配到三个商品,会出现少0.01的情况。
BigDecimal a = new BigDecimal("10");
BigDecimal divide = a.divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP);
System.out.println(divide.multiply(BigDecimal.valueOf(3)));
打印结果:9.99