BigDecimal使用 加减乘除 小数点 比较大小

BigDecimal 日常开发咋用

简介

用最简单的话来概括就是,这是ava.math包中提供的API类,对超过16位有效位的数进行精确的运算。
一般在java开发中,涉及到金额等敏感数字,不能接收有任何精度损失的时候,使用BigDecimal解决相关问题。
ps:为何不使用double 是因为双精度浮点型变量double可以处理16位有效数,但是实际生活业务场景中,大额数字(尤其是日元,韩元,津巴布韦币。。)会失去精度,因为不论是float 还是double都是浮点数,而计算机是二进制的,浮点数会失去一定的精确度。十进制值通常没有完全相同的二进制表示形式;十进制数的二进制表示形式可能不精确。

构造器

BigDecimal(int) 创建一个具有参数所指定整数值的对象。

BigDecimal(double) 创建一个具有参数所指定双精度值的对象。(不建议采用)

BigDecimal(long) 创建一个具有参数所指定长整数值的对象。

BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。

推荐使用BigDecimal.valueOf()方法来完成初始化值,少用构造方法对BigDecimal赋值,BigDecimal构造器会对不同数据类型调用不通的构造方法。

加减乘除

		BigDecimal amount = new BigDecimal("3");
		BigDecimal decimal = BigDecimal.valueOf(3);
		BigDecimal add = amount.add(decimal);
		System.out.println(add);
		System.out.println(amount.add(decimal));
		amount = amount.add(decimal);
		System.out.println(amount);

输出结果在这里插入图片描述

		BigDecimal amount = new BigDecimal("3");
		BigDecimal decimal = BigDecimal.valueOf(3);
		BigDecimal add = amount.subtract(decimal);
		System.out.println(add);
		System.out.println(amount);

输出结果在这里插入图片描述
PS:从这里可以看出,bigDecimal是对象之间的操作,amount.subtract()后,amount对象本身的值是不会变化的,需要用一个新的对象来接收相减后的值。

		BigDecimal amount = new BigDecimal("3");
		BigDecimal decimal = BigDecimal.valueOf(3);
		BigDecimal add = amount.multiply(decimal);
		System.out.println(add);
		System.out.println(amount);

输出结果在这里插入图片描述

		BigDecimal amount = new BigDecimal("3");
		BigDecimal decimal = BigDecimal.valueOf(3);
		BigDecimal add = amount.divide(decimal);
		System.out.println(add);
		System.out.println(amount);

输出结果在这里插入图片描述
使用除法后,出现无限不循环小数等等复杂情况下,可以设置保留相关小数
报错信息:
Exception in thread “main” java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide(BigDecimal.java:1707)
at com.yhsc.yhsc.mall.service.impl.YhscApproveLogServiceImpl.main(YhscApproveLogServiceImpl.java:74)

小数点设置

		BigDecimal amount = new BigDecimal("10");
		BigDecimal decimal = BigDecimal.valueOf(3);
		BigDecimal add = amount.divide(decimal,2,ROUND_CEILING);
		System.out.println(add);
		System.out.println(amount);

输出结果在这里插入图片描述
divide(bigdecimal,保留小数点后几位小数,舍入模式)

舍入模式

ROUND_CEILING

向正的无限方向舍入

ROUND_DOWN

向零方向舍入

ROUND_FLOOR

向负的无限方向舍入

ROUND_HALF_DOWN

除非两侧距离相等,否则四舍五入到最接近(距离)的一侧。 如果是,就四舍五入。 例如,1.55会保留小数1.5的结果

ROUND_HALF_EVEN

向最接近(距离)的一侧的舍入,除了两侧)的距离相等的情况以外,如果是,则在预约位数为奇数的情况下为ROUND_HALF_UP,在偶数的情况下为

ROUND_HALF_DOWN

ROUND_HALF_UP (常用)

方向(距离) )

最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6,也就是我们常说的“四舍五入”
ROUND_UNNECESSARY

计算结果是精确的,不需要舍入模式

ROUND_UP

向远离0的方向舍入

对BigDecimal进行截断
需要对BigDecimal进行截断和四舍五入可用setScale方法

  1. setScale(int x); BigDecimal值后保留x位小数

  2. setScale(x, BigDecimal.ROUND_DOWN); 保留1位小数,默认用四舍五入

  3. setScale(x, BigDecimal.ROUND_HALE_UP); 保留一位小数,向上舍入

  4. setScale(x, BigDecimal.ROUND_HALF_DOWN); 保留一位小数,向下舍入

		BigDecimal amount = new BigDecimal("10.565305");
		BigDecimal bigDecimal1 = amount.setScale(1, BigDecimal.ROUND_DOWN);// 直接删除多余的小数
		BigDecimal bigDecimal2 = amount.setScale(2, BigDecimal.ROUND_HALF_UP);//四舍五入,向上舍入
		BigDecimal bigDecimal3 = amount.setScale(3, BigDecimal.ROUND_HALF_DOWN);//四舍五入,向下舍入
		System.out.println(bigDecimal1);
		System.out.println(bigDecimal2);
		System.out.println(bigDecimal3);

输出结果

如何比较

BigDecimal比较大小使用compareTo(BigDecimal)方法:

int flag = bigdemical.compareTo(bigdemical1)。

flag = -1,表示bigdemical小于bigdemical1。

flag =0,表示bigdemical等于bigdemical1。

flag =1,表示bigdemical大于bigdemical1。

实际中直接跟0比较就可以了,别跟-1或者1比较。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值