原因
- 为什么要有BigDecimal类
- 因为二进制的缘故,直接对浮点数进行运算,会导致
精度丢失
的问题- 下例:出现了
0.1 + 0.2 <> 0.3
常见的API
- 这些API中,并
不推荐
由double
类型转换的BigDecimal,因为底层还是double- 推荐使用由string 类型转换的BigDecimal,因为它是以字符串串的形式存储数据,甚至是每一位小数点。
常见转换和运算方式
Double a = 0.1;
Double b = 0.2;
Double c = a + b;
System.out.println(c); // 0.30000000000000004// 使用BigDecimal解决(错误方式)
BigDecimal bigDecimal1 = new BigDecimal(a);
BigDecimal bigDecimal2 = new BigDecimal(b);
BigDecimal bigDecimal3 = bigDecimal1.add(bigDecimal2);
//结果还错的 0.3000000000000000166533453693773481063544750213623046875
System.out.println(bigDecimal3);// 使用BigDecimal解决(正确方式)`在这里插入代码片`
// 先将所有的double类型转换成String类型 再转换成BigDecimal类型
BigDecimal bigDecimal4 = new BigDecimal(a.toString());
BigDecimal bigDecimal5 = new BigDecimal(b.toString());
BigDecimal bigDecimal6 = bigDecimal4.add(bigDecimal5);
System.out.println(bigDecimal6); // 0.3
其实jdk提供了更为简便的valueOf(),这玩意儿熟悉吧,每一个包装类都有一个API,传入一个double类型,会自动转换为字符串类型,再转换为BigDecimal类型
// 使用BigDecimal解决(正确方式)
// 使用BigDecimal的valueOf方法
BigDecimal bigDecimal7 = BigDecimal.valueOf(a);
BigDecimal bigDecimal8 = BigDecimal.valueOf(b);
BigDecimal bigDecimal9 = bigDecimal7.add(bigDecimal8);
System.out.println(bigDecimal9); // 0.3
加减乘除
// 加减乘除
BigDecimal add = bigDecimal7.add(bigDecimal8);
BigDecimal subtract = bigDecimal7.subtract(bigDecimal8);
BigDecimal multiply = bigDecimal7.multiply(bigDecimal8);
BigDecimal divide = bigDecimal7.divide(bigDecimal8);
System.out.println(add); // 0.3
System.out.println(subtract); // -0.1
System.out.println(multiply); // 0.02
System.out.println(divide); // 0.5
除法比较特殊 如果除不尽,没有确定保留位数,就会报错
BigDecimal divide1 = BigDecimal.valueOf(0.1).divide(BigDecimal.valueOf(0.3));
// 除不尽的情况下,可以指定保留小数点后几位,以及舍入模式
BigDecimal divide1 = BigDecimal.valueOf(0.1).divide(BigDecimal.valueOf(0.3), 2, BigDecimal.ROUND_HALF_UP);
System.out.println(divide1); // 0.33