先看以下测试用例
public static void main(String[] args) throws ScriptException, InterruptedException, ParseException, IOException { System.out.println( 10.2 * 100);//期望1020 实际:1019.9999999999999 System.out.println( 10.2 * 100D);//期望1020 实际:1019.9999999999999 System.out.println(new BigDecimal(10.2).multiply(new BigDecimal(100)));//期望1020 实际:1019.999999999999928945726423989981412887573242187500 System.out.println(new BigDecimal(10.2D).multiply(new BigDecimal(100D)));//期望1020 实际:1019.999999999999928945726423989981412887573242187500 System.out.println(new BigDecimal(Double.toString(10.2)).multiply(new BigDecimal(Double.toString(100))));//期望1020 实际:1020.00 System.out.println(0.1+0.2);//期望0.3 实际:0.30000000000000004 System.out.println(new BigDecimal(0.1).add(new BigDecimal(0.2)));//期望0.3 实际:0.3000000000000000166533453693773481063544750213623046875 System.out.println(new BigDecimal(Double.toString(0.1)).multiply(new BigDecimal(Double.toString(0.3))));//期望1020 实际:0.03 }
针对小数直接运算原因
float和double进行运算,都是需要将小数转为二进制再进行运算,但是二进制并不能精确表达所有小数,通过转为二进制后运算有可能会丢失精度 所以使用BigDecimal 进行数学运算
针对BigDecimal double构造函数运算丢失精度问题原因
java 手册api函数说明
public BigDecimal(double val)
Double.toString(double)
方法,然后使用 BigDecimal(String)
构造方法,将 double 转换为 String 。要获取该结果,请使用 static valueOf(double)
方法。
原文:https://www.cnblogs.com/LQBlog/p/15184046.html