写在前面BigDecimal的方法已被弃用,用RoundingMode代替
UP(BigDecimal.ROUND_UP)
DOWN(BigDecimal.ROUND_DOWN)
CEILING(BigDecimal.ROUND_CEILING)
FLOOR(BigDecimal.ROUND_FLOOR)
HALF_UP(BigDecimal.ROUND_HALF_UP)
HALF_DOWN(BigDecimal.ROUND_HALF_DOWN)
HALF_EVEN(BigDecimal.ROUND_HALF_EVEN)
UNNECESSARY(BigDecimal.ROUND_UNNECESSARY)
目录
(二)BigDecimal 减法运算——subtract()方法
(三)BigDecimal 乘法运算——multiply()方法
(四)BigDecimal 除法运算——divide()方法
(五)关于BigDecimal.setScale方法—— 处理小数
2、BigDecimal.ROUND_DOWN直接删除多余的小数位
3、BigDecimal.ROUND_HALF_UP 四舍五入
1、movePointRight、scaleByPowerOfTen 小数点向右移动两位
- BigDecimal bigInt1 = new BigDecimal(6);
- BigDecimal bigInt2 = new BigDecimal(8);
- BigDecimal intSum = new BigDecimal(0);
- //BigDecimal求和
- intSum = bigInt1 .add(bigInt2);
- System.out.println("和 :" +intSum);
- //打印输出 和 :14
- BigDecimal bigDouble1 = new BigDecimal(6.6);
- BigDecimal bigDouble2 = new BigDecimal(8.8);
- BigDecimal doubleSum = new BigDecimal(0);
- //BigDecimal求和
- doubleSum = bigDouble1.add(bigDouble2);
- System.out.println("和:" + doubleSum );
- //打印输出 和:15.4000000000000003552713678800500929355621337890625
输出的结果与我们心中所想是不是不太一样?
原因: double不能表示为任何有限长度的二进制小数,所以会出现丢失精度问题。
解决方法: 官方文档中建议使用字符串形式,这样不会丢失精度。
- BigDecimal bigString1 = new BigDecimal("6.6");
- BigDecimal bigString2 = new BigDecimal("8.8");
- BigDecimal stringSum = new BigDecimal(0);
- //BigDecimal求和
- stringSum= bigString1.add(bigString2);
- System.out.println("和 :" +stringSum);
- //打印输出 和 :15.4
这样就完美的解决了丢失精度的问题。
- BigDecimal bigInt1 = new BigDecimal(8);
- BigDecimal bigInt2= new BigDecimal(6);
- BigDecimal intDifference = new BigDecimal(0);
- //BigDecimal求差
- intDifference = bigInt1.subtract(bigInt2);
- System.out.println("差 :" +intDifference);
- //打印输出 差:2
- BigDecimal bigDouble1= new BigDecimal(8.8);
- BigDecimal bigDouble2= new BigDecimal(6.6);
- BigDecimal douDifference = new BigDecimal(0);
- //BigDecimal求差
- douDifference = bigDouble1.subtract(bigDouble2);
- System.out.println("差 :" +douDifference );
- //打印输出 差 :2.2000000000000010658141036401502788066864013671875
- BigDecimal bigString1 = new BigDecimal("8.8");
- BigDecimal bigString2= new BigDecimal("6.6");
- BigDecimal stringDifference = new BigDecimal(0);
- //BigDecimal求差
- stringDifference = bigString1.subtract(bigString2);
- System.out.println("差 :" +stringDifference );
- //打印输出 差 :2.2
- BigDecimal bigInt1 = new BigDecimal(8);
- BigDecimal bigInt2= new BigDecimal(6);
- BigDecimal intProduct = new BigDecimal(0);
- //BigDecimal求积
- intProduct= bigInt1.multiply(bigInt2);
- System.out.println("积 :" +intProduct);
- //打印输出 积:48
- BigDecimal bigDouble1= new BigDecimal(8.8);
- BigDecimal bigDouble2= new BigDecimal(6.6);
- BigDecimal douProduct = new BigDecimal(0);
- //BigDecimal求积
- douProduct = bigDouble1.multiply(bigDouble2);
- System.out.println("积 :" +douProduct );
- //打印输出 积:58.0800000000000015631940186722201564809837179480972682468591095084065045739407651126384735107421875
- BigDecimal bigString1= new BigDecimal("8.8");
- BigDecimal bigString2= new BigDecimal("6.6");
- //BigDecimal求积
- BigDecimal strProduct = new BigDecimal(0);
- strProduct = bigString1.multiply(bigString2);
- System.out.println("积 :" +strProduct);
- //打印输出 积 :58.08
:58.08
- BigDecimal bigInt1= new BigDecimal(24);
- BigDecimal bigInt2= new BigDecimal(3);
- BigDecimal intConsult = new BigDecimal(0);
- //BigDecimal求商
- intConsult = bigInt1.divide(bigInt2);
- System.out.println("商 :" +intConsult);
- //打印输出 商 :8
- BigDecimal bigDouble1= new BigDecimal(24.6);
- BigDecimal bigDouble2= new BigDecimal(2);
- BigDecimal douConsult = new BigDecimal(0);
- //BigDecimal求商
- douConsult = bigDouble1.divide(bigDouble2);
- System.out.println("商 :" +douConsult);
- //打印输出 商:12.300000000000000710542735760100185871124267578125
- BigDecimal bigString1= new BigDecimal("24.6");
- BigDecimal bigString2= new BigDecimal("2");
- BigDecimal strConsult = new BigDecimal(0);
- //BigDecimal求商
- strConsult = bigString1.divide(bigString2);
- System.out.println("商:" +strConsult);
- //打印输出 商:12.3
- BigDecimal test= new BigDecimal(6.51);
- //表示保留一位小数,只要第二位小数不为0都进1
- System.out.println(test.setScale(1,BigDecimal.ROUND_UP));
- //输出:6.6
-
- BigDecimal test= new BigDecimal(6.50);
- //表示保留一位小数,只要第二位小数不为0都进1
- System.out.println(test.setScale(1,BigDecimal.ROUND_UP));
- //输出:6.5
- BigDecimal test= new BigDecimal(6.59);
- //直接删除多余的小数位
- System.out.println(test.setScale(1,BigDecimal.ROUND_DOWN));
- //输出:6.5
- BigDecimal test= new BigDecimal(6.55);
- //四舍五入
- System.out.println(test.setScale(1,RoundingMode.HALF_UP));
- //输出:6.6
-
- //test.setScale(1,BigDecimal.ROUND_HALF_UP)
- //BigDecimal.ROUND_HALF_UP已弃用
-
6.6
- BigDecimal test= new BigDecimal("88.666");
- System.out.println(test.movePointRight(2));
- System.out.println(test.scaleByPowerOfTen(2));
- //输出: 8866.6 8866.6
- BigDecimal test= new BigDecimal("88.666");
- System.out.println(test.movePointLeft(2));
- //输出:0.88666
- BigDecimal bigTest1= new BigDecimal("100");
- BigDecimal bigTest2= new BigDecimal("68.688");
- System.out.println(bigTest2.divide(bigTest1,2,RoundingMode.HALF_UP));
- //输出:0.69
9
总结
1、商业计算使用BigDecimal
2、尽量使用参数类型为String的构造函数
3、BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值