一、介绍
在金融、科学计算场景下,用Decimal可以高精度的数字计算。
二、使用
1.乘法
进行乘法运算时,要求服务费为本金*0.01,保留2位小数,除0舍弃部分进一。
String capital = "23";
BigDecimal capitalBd = new BigDecimal(capital);
BigDecimal result = capitalBd.multiply(new BigDecimal(0.01)).setScale(2,BigDecimal.ROUND_UP));
发现result的结果是0.24(23*0.01该是0.23喃)
后来发现Decimal在做乘法运算时,会将0.01进行类型转换成double,精度不够造成值得变化,从而没能算出理想值。
2.除法
Decimal a = new Decima("10");
Decimal b = new Decimal("3");
Decimal c = a.divide(b);
会报错:Non-terminating decimal expansion; no exact representable decimal result
需要将最后一行,加上约束:小数点精度和保留模式.
//保留两位小数,除零舍弃进一。
Decimal c = a.divide(b,2,Decimal.ROUND_UP);
三、api
BigDecimal.divide(BigDecimal divisor, int scale, RoundingMode roundingMode) ;
scale为小数位数;
roundingMode为小数模式;
ROUND_CEILING
如果 BigDecimal 是正的,则做 ROUND_UP 操作;如果为负,则做 ROUND_DOWN 操作。
ROUND_DOWN
从不在舍弃(即截断)的小数之前增加数字。
ROUND_FLOOR
如果 BigDecimal 为正,则作 ROUND_UP ;如果为负,则作 ROUND_DOWN 。
ROUND_HALF_DOWN
若舍弃部分> .5,则作 ROUND_UP;否则,作 ROUND_DOWN 。
ROUND_HALF_EVEN
如果舍弃部分左边的数字为奇数,则作 ROUND_HALF_UP ;如果它为偶数,则作 ROUND_HALF_DOWN 。
ROUND_HALF_UP
若舍弃部分>=.5,则作 ROUND_UP ;否则,作 ROUND_DOWN 。
ROUND_UNNECESSARY
该“伪舍入模式”实际是指明所要求的操作必须是精确的,,因此不需要舍入操作。
ROUND_UP
总是在非 0 舍弃小数(即截断)之前增加数字。
四、总结
构造函数有四种,一般参数用double和string.做乘除法时,注意上面问题。