BigDecimal运算使用方法(附简单案例,四舍五入等)
BigDecimal.setScale()方法用于格式化小数点:
setScale(1)表示保留一位小数,默认用四舍五入的方式 setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3 setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4 setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4 setScale(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍
注意:
1、scale指的是小数位后的位数,比如123.456的scale为3;
2、自Java 9版本起,ROUND_DOWN常量已被弃用,并且被RoundingMode枚举值取代
setScale(1)表示保留一位小数,默认用四舍五入的方式 setScale(1,RoundingMode.DOWN)直接删除多余的小数位,如2.35会变成2.3 setScale(1,RoundingMode.UP)进位处理,2.35变成2.4 setScale(1,RoundingMode.HALF_UP)四舍五入,2.35变成2.4 setScale(1,RoundingMode.HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍
(一)BigDecimal 加法运算——add()方法
1、Int 类型
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
2、double 类型
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不能表示为任何有限长度的二进制小数,所以会出现丢失精度问题。
解决方法: 官方文档中建议使用字符串形式,这样不会丢失精度。
3、String类型
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 减法运算——subtract()方法
1、Int 类型
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
2、double 类型
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
3、String类型
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 乘法运算——multiply()方法
1、Int 类型
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
2、double 类型
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
3、String类型
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
(四)BigDecimal 除法运算——divide()方法
1、Int 类型
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
2、double 类型
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
3、String类型
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.setScale方法—— 处理小数
1、BigDecimal.ROUND_UP 进位处理
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
2、BigDecimal.ROUND_DOWN直接删除多余的小数位
BigDecimal test= new BigDecimal(6.59); //直接删除多余的小数位 System.out.println(test.setScale(1,BigDecimal.ROUND_DOWN)); //输出:6.5
3、BigDecimal.ROUND_HALF_UP 四舍五入
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已弃用
(六)BigDecimal移动小数点的方法
1、movePointRight、scaleByPowerOfTen 小数点向右移动两位
BigDecimal test= new BigDecimal("88.666"); System.out.println(test.movePointRight(2)); System.out.println(test.scaleByPowerOfTen(2)); //输出: 8866.6 8866.6
2、movePointLeft 小数点向左移动两位
BigDecimal test= new BigDecimal("88.666"); System.out.println(test.movePointLeft(2)); //输出:0.88666
(七)BigDecimal除法后保留两位小数
BigDecimal bigTest1= new BigDecimal("100"); BigDecimal bigTest2= new BigDecimal("68.688"); System.out.println(bigTest2.divide(bigTest1,2,RoundingMode.HALF_UP)); //输出:0.69
总结
1、商业计算使用BigDecimal
2、尽量使用参数类型为String的构造函数
3、BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值