Java BigDecimal 详解

一、概述

BigDecimal是Java在java.math包中提供的线程安全的API类,用来对超过16位有效位的数进行精确的运算。因为DoubleFloat会丢失精度,所以开发中,如果我们需要精确计算的结果,则必须使用BigDecimal类来操作。

BigDecimal所创建的是对象,故我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。

二、构造方法

BigDecimal的构造方法比较多,但常见的如下表格

方法解释
BigDecimal(String val)字符串转换为BigDecimal (推荐使用)
BigDecimal(int val)int 转换为BigDecimal
BigDecimal(long val)long 转换为BigDecimal
BigDecimal(BigInteger val)BigInteger 转换为BigDecimal
BigDecimal(double val)double 转换为BigDecimal (不推荐,因为存在精度丢失问题)

三、常用方法

1. 加法(add)

两个BigDecimal对象进行相加,返回新的一个BigDecimal对象,原来加数的值不变。

BigDecimal a = new BigDecimal("1.44444");
BigDecimal b = new BigDecimal("1.33333");
System.out.println(a.add(b));
System.out.println(a);

输出如下:

2.77777
1.44444

2. 减法(subtract)

BigDecimal a = new BigDecimal("1.44444")
BigDecimal b = new BigDecimal("1.33333")
System.out.println(a.subtract(b));
System.out.println(a);

输出如下:

0.11111
1.44444

3. 乘法(multiply)

BigDecimal a = new BigDecimal("1.44444");
BigDecimal b = new BigDecimal("1.33333");
System.out.println(a.multiply(b));
System.out.println(a.multiply(b, new MathContext(5, RoundingMode.HALF_UP))); //设置精度为5位
System.out.println(a.multiply(b).setScale(5, RoundingMode.HALF_UP)); //设置小数点为5位

输出如下:

1.9259151852
1.9259
1.92592

4. 除法(divide)

BigDecimal a = new BigDecimal("1.44444");
BigDecimal b = new BigDecimal("1.33333");
System.out.println(a.divide(b, 4, RoundingMode.HALF_UP)); // 设置小数点为4位

输出如下:

1.0833

5. 取整

BigDecimal a = new BigDecimal("100.11");
BigDecimal b = new BigDecimal("50");
System.out.println(a.divideToIntegralValue(b));

输出如下:

2.00

6. 取余

BigDecimal a = new BigDecimal("100.11");
BigDecimal b = new BigDecimal("50");
System.out.println(a.remainder(b));

输出如下:

0.11

7. 求和

List<BigDecimal> nums = new LinkedList<>();
nums.add(new BigDecimal(-1));
nums.add(new BigDecimal(-1));
nums.add(new BigDecimal(-3));

Optional<BigDecimal> bigDecimal = nums.stream().reduce(BigDecimal::add);
System.out.println(bigDecimal.get()); //-5

8. 最大值、最小值

BigDecimal max = nums.stream().reduce(nums.get(0), BigDecimal::max);
System.out.println(max); //-1

BigDecimal min = nums.stream().reduce(nums.get(0), BigDecimal::min);
System.out.println(min); //-3

9. 比较大小

  • BigDecimalequals方法,其实不只是会比较数字的值,还会对其标度进行比较,是极其严格的。
  • BigDecimalcompareTo方法,只比较值,其中返回结果:-1表示小于,0表示等于,1表示大于。
BigDecimal a = new BigDecimal("-1.00");
BigDecimal b = new BigDecimal("-1.0");
BigDecimal c = new BigDecimal(-3);

System.out.println(a.compareTo(b));
System.out.println(c.compareTo(b));
System.out.println(b.compareTo(c));
System.out.println(a.equals(b)); // equals是极其严格的
0
-1
1
false

10. 设置精度

BigDecimal a = new BigDecimal("1.234567");
System.out.println(a.setScale(3, RoundingMode.HALF_UP)); //常用的四舍五入

四、格式化

BigDecimal a = new BigDecimal("2.335");
BigDecimal b = new BigDecimal("0.035757");

NumberFormat percent = NumberFormat.getPercentInstance();  //建立百分比格式化引用
percent.setMaximumFractionDigits(3); //百分比小数点最多3位
System.out.println("a利率:\t" + percent.format(a));
System.out.println("b利率:\t" + percent.format(b));
a利率:	233.5%
b利率:	3.576%

五、注意点

1. NULL值不能参加计算

在使用BigDecimal类型进行计算时,进行加、减、乘、除、比较大小时,一定要保证参与计算的两个值不能为空,否则会抛出java.lang.NullPointerException异常。

BigDecimal b1 = new BigDecimal("1");
BigDecimal b2 = null;
System.out.println("相加:"+b2.add(b1)); //抛异常

2. 等值比较的坑

不要用==或者equals比较BigDecimal的值,equals方法,其实不只是会比较数字的值,还会对其标度进行比较,是极其严格的。
尤其当用字符串转BigDecimal对象后,千万不要用equals,容易有坑。所以最好用compareTo方法。

  • 17
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

为啥总是用户昵称已存在

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

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

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

打赏作者

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

抵扣说明:

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

余额充值