欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java BigDecimal介绍

程序员文章站 2022-07-15 12:28:32
...

1. 介绍

BigDecimal 由任意精度的整数 非标度值32 位 的整数标度 (scale) 组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负scale 次幂。因此,BigDecimal表示的数值是 (unscaledValue × 10scale)

2. 为什么要使用 BigDecimal?

Javajava.math 包中提供的 APIBigDecimal,用来对 超过16位 有效位的数进行精确的运算。双精度浮点型变量double 可以 处理16位 有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在 商业计算中若需要精确的计算结果则要用java.math.BigDecimal类

比如:货币计算

3. 常用的构造函数

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

注意:

不建议使用 BigDecimal(double)的构造函数,这是因为,BigDecimal的构造函数 public BigDecimal(double val) 损失了double 参数的精度。例如:

1double d = 100000.05;
2System.out.println(new BigDecimal(d));
3//输出结果:100000.050000000002910383045673370361328125

解决方法:

  1. 可以将double转成String类型,再用 BigDecimal(String) 的构造函数
  2. 使用BigDecimal的静态方法 public static BigDecimal valueOf(double paramDouble) 初始化BigDecimal
1double d = 100000.05;
2System.out.println(new BigDecimal(String.valueOf(d)));
3
4BigDecimal bigDecimal = BigDecimal.valueOf(d);
5System.out.println(bigDecimal);
6//输出结果:
710000.05
810000.05

4.常用方法

  • public BigDecimal add(BigDecimal value);//加法
  • public BigDecimal subtract(BigDecimal value);//减法
  • public BigDecimal multiply(BigDecimal value);//乘法
  • public BigDecimal divide(BigDecimal value);//除法
  • public int compareTo(BigDecimal paramBigDecimal);//比较

注意:

1.BigDecimal的运算都没有对原值进行操作,而是返回一个新的BigDecimal对象。所以一定要对计算的结果保存。

1BigDecimal b1 = new BigDecimal(1);
2BigDecimal b2 = new BigDecimal(2);
3System.out.println("b1:" + b1);//1
4System.out.println("b2:" + b2);//2
5b1.add(b2);
6System.out.println("b1:" + b1);//1
7System.out.println("b2:" + b2);//2

上面例子中,如果希望b1 = b1 + b2 ,需要将 add 后的结果赋值给 b1

1BigDecimal b1 = new BigDecimal(1);
2BigDecimal b2 = new BigDecimal(2);
3System.out.println("b1:" + b1);//1
4System.out.println("b2:" + b2);//2
5b1 = b1.add(b2);
6System.out.println("b1:" + b1);//3
7System.out.println("b2:" + b2);//2

2.比较两个BigDecimal的值 需要使用BigDecimal的 compareTo 方法,不能使用equals。这是因为,equals 方法不仅会比较值的大小,还会比较两个BigDecimal的精度,而 compareTo 方法则不会比较精度,只会比较值的大小。

1BigDecimal b1 = new BigDecimal("1.0");
2BigDecimal b2 = new BigDecimal("1.000");
3System.out.println(b1.equals(b2));
4System.out.println(b1.compareTo(b2) == 0);
5//输出结果:
6false
7true

3.使用BigDecimal的除法 divide 时,要注意设置精度,否则可能会出现除不尽的情况,会直接抛出异常

如下代码会抛出java.lang.ArithmeticException的异常

1BigDecimal b1 = new BigDecimal(10);
2BigDecimal b2 = new BigDecimal(3);
3System.out.println(b1.divide(b2));

可以改成

1BigDecimal b1 = new BigDecimal(10);
2BigDecimal b2 = new BigDecimal(3);
3System.out.println(b1.divide(b2,2,BigDecimal.ROUND_HALF_UP));
4//输出结果:3.33

Java BigDecimal介绍

相关标签: java BigDecimal