BigDecimal使用加减乘除小数点比较大小-创新互联

BigDecimal 日常开发咋用 简介

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

创新互联建站是一家专注于成都网站建设、网站制作与策划设计,江山网站建设哪家好?创新互联建站做网站,专注于网站建设10年,网设计领域的专业建站公司;建站业务涵盖:江山等地区。江山做网站价格咨询:18982081108构造器

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比较。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前题目:BigDecimal使用加减乘除小数点比较大小-创新互联
分享链接:http://scyanting.com/article/dhjgoc.html