用最简单的话来概括就是,这是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方法
setScale(int x); BigDecimal值后保留x位小数
setScale(x, BigDecimal.ROUND_DOWN); 保留1位小数,默认用四舍五入
setScale(x, BigDecimal.ROUND_HALE_UP); 保留一位小数,向上舍入
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元起,快前往官网查看详情吧