一.做乘法(精度问题)
优课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