BigDecimal运算

BigDecimal加减乘除运算

public BigDecimal add(BigDecimal value);         //加法
public BigDecimal subtract(BigDecimal value);     //减法 
public BigDecimal multiply(BigDecimal value);    //乘法
public BigDecimal divide(BigDecimal value);      //除法
BigDecimal a = new BigDecimal("4.5");
BigDecimal b = new BigDecimal("1.5");
 
System.out.println("a + b =" + a.add(b));
System.out.println("a - b =" + a.subtract(b));
System.out.println("a * b =" + a.multiply(b));
System.out.println("a / b =" + a.divide(b));

关于BigDecimal除法

除法运算divide.BigDecimal除法可能出现不能整除的情况,比如 4.5/1.3,这时会报错java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

其实divide方法有可以传三个参数
public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) 

第一参数表示除数;
第二个参数表示小数点后保留位数;
第三个参数表示舍入模式;

只有在作除法运算或四舍五入时才用到舍入模式,有下面这几种
ROUND_CEILING    //向正无穷方向舍入
ROUND_DOWN    //向零方向舍入
ROUND_FLOOR    //向负无穷方向舍入
ROUND_HALF_DOWN    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5
ROUND_HALF_EVEN    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN
ROUND_HALF_UP    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6
ROUND_UNNECESSARY    //计算结果是精确的,不需要舍入模式
ROUND_UP    //向远离0的方向舍入

保留小数位

BigDecimal decimal = new BigDecimal("1.12345");
BigDecimal setScale = decimal.setScale(4,BigDecimal.ROUND_HALF_DOWN);
BigDecimal setScale1 = decimal.setScale(4,BigDecimal.ROUND_HALF_UP);

BigDecimal运算

注意

(1) 商业计算使用BigDecimal。
(2) 尽量使用参数类型为String的构造函数。
(3) BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值。

上一篇:购物车的程序设计


下一篇:Stream聚合函数