BigDecimal运算使用方法(附简单案例)

(一)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,BigDecimal.ROUND_HALF_UP));
		-----------------------------------------
		输出:6.6

(六)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,BigDecimal.ROUND_HALF_UP));
		-----------------------------------------
		输出:0.69

总结

1、商业计算使用BigDecimal

2、尽量使用参数类型为String的构造函数

3、BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值


文章仅用来作记录分享,以上纯属个人见解,如有不当之处,还望指正。

最近开通个人了微信公众号,以后将会定期分享工作学习过程中遇到的问题,欢迎关注与我一道成长交流~:

微信搜索: MYY668999程序猿爱篮球 即可上车。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿爱篮球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值