BigDecimal进行乘除运算时注意事项

海豚精灵https://mgo.whhtjl.com

一.做乘法(精度问题)

优课GO业务要求:购卡用户付款成功后,将卡费的30%奖励给直接推广员,保留2位小数,从不在舍弃(即截断)的小数之前增加数字。

package test;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Test {
	public static void main(String[] args) {
		String money="0.1";//卡费
		BigDecimal reallyPayMoney=new BigDecimal(money);
		System.out.println("结果:"+reallyPayMoney.multiply(new BigDecimal(0.3)).setScale(2, RoundingMode.DOWN));
	}
}

运行上面的代码显示结果如下:

嗯哼,0.1*0.3不等于0.03吗?怎么会是0.02呢?

后来发现Decimal在做乘法运算时,会将0.3进行类型转换成float,精度不够造成值的变化,从而没能算出理想值。

这个解决方案是初始化时将参数设置为String型

修改代码后再次运行,结果如下所示:

二.做除法(出现无限循环小数)

System.out.println(BigDecimal.ONE.divide(new BigDecimal("3")));

运行报错,如下所示:

解决方案是运算时设置精度,修改代码后并运行,结果如下所示:

OK

猜你喜欢

转载自blog.csdn.net/qq_35393693/article/details/108528582