BigDecimal

一:背景

        在项目中,金额的计算通常使用BigDecimal来保证精确计算。BigDecimal可以处理任意长度数字序列的数值,实现了任意精度的浮点数运算。《阿里巴巴 Java 开发手册》中提到:浮点数之间的等值判断,基本数据类型不能用 == 来比较,包装数据类型不能用 equals 来判断。

Double a1=1.11111111111111111111d;
Double a2=1.11111111111111111112d;


System.out.println(a1);
System.out.println(a2);
System.out.println(a1.equals(a2));


//结果
1.1111111111111112
1.1111111111111112
true

二:注意事项

        在使用BigDecimal的时候,应尽量使用String类型,否则会存在丢失精度。

BigDecimal a = new BigDecimal("1.01");
BigDecimal b = new BigDecimal(String.valueOf(1.151561d));

三:相关API

     加减乘除

//加
num1.add(num2);

//减    
num1.subtract(num2);

//乘
num1.multiply(num2);

//除,保留两位小数,且取四舍五入
num1.divide(num2,2,BigDecimal.ROUND_HALF_UP);

//绝对值
num1.abs();

   

除的API

divisor 要除以的数,scale小数位数, roundingMode 保留位数

public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) {
        return divide(divisor, scale, roundingMode.oldMode);
}

常用的舍入模式:ROUND_HALF_UP 四舍五入

保留小数位数: 

下图设置两位小数

BigDecimal a = new BigDecimal("1.041");
BigDecimal b = a.setScale(2, BigDecimal.ROUND_HALF_UP); //1.04

比较大小

BigDecimal a = new BigDecimal("1.041");
BigDecimal b = a.setScale(2, BigDecimal.ROUND_HALF_UP);

//<0 代表a小于b, 大于0代表a大于b,==0代表a等于b      
System.out.println(a.compareTo(b));

位数左移、右移

BigDecimal a = new BigDecimal("1.041");
//104.1
System.out.println(a.movePointRight(2));
//0.1041
System.out.println(a.movePointLeft(1));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值