今天遇到一个bigdecimal的加减乘除数值运算,需要保留两位小数。哈哈,一执行,发现跟预期的不一样,结果是3.16。原来,String.format()方法会对格式化的数进行四舍五入,但是如果不需要四舍五入怎么办?答案是使用BigDecimal进行运算。我是这样写的:
BigDecimal是Java中的一个类,用于进行高精度的浮点数运算。它提供了比float和double更精确的算术运算,并且可以控制舍入模式。BigDecimal特别适用于金融和其他需要高精度计算的领域主要特点:高精度:BigDecimal可以表示任意精度的浮点数,不会像float和double那样出现精度损失。可控的舍入模式:可以通过RoundingMode枚举来控制舍入行为。不可变性:BigDecimal对象是不可变的,这意味着所有操作都会返回新的BigDecimal实例,而不会修改原始对象。丰富的操作方法:提供了加、减、乘、除等多种数学运算方法。
使用BigDecimal进行加减乘除运算
加法
BigDecimal a = new BigDecimal(“1”);
BigDecimal b = new BigDecimal(“3”);
System.out.println(a.add(b));
减法
BigDecimal a = new BigDecimal(“1”);
BigDecimal b = new BigDecimal(“3”);
System.out.println(a.subtract(b));
乘法
BigDecimal a = new BigDecimal(“2”);
BigDecimal b = new BigDecimal(“3”);
System.out.println(a.multiply(b));
除法
BigDecimal a = new BigDecimal(“2”);
BigDecimal b = new BigDecimal(“3”);
System.out.println(a.divide(b, 2, RoundingMode.HALF_UP));
由于除法的结果可能会有小数,所以需要对除法的结果进行精度控制并选取舍入模式。RoundingMode是java.math.BigDecimal类中的一个枚举类型,用于指定在进行舍入操作时采用的舍入模式。以下是一些常见的RoundingMode值及其含义:
UP:远离零方向舍入。总是增加数值的绝对值。DOWN:向零方向舍入。总是减少数值的绝对值。CEILING:向正无穷方向舍入。FLOOR:向负无穷方向舍入。HALF_UP:四舍五入,这是最常见的舍入模式。HALF_DOWN:五舍六入。HALF_EVEN:银行家舍入法,也称为“四舍六入五成双”。UNNECESSARY:表示不需要舍入,如果需要舍入则抛出ArithmeticException。
总结:商业计算使用BigDecimal。尽量使用参数类型为String的构造函数。BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值。