Java BigDecimal

时间:2020-02-23 14:36:23  来源:igfitidea点击:

Java BigDecimal类用于处理财务数据。
在处理高精度算术或者需要对舍入计算进行更精细控制的情况下,首选BigDecimal。

Java BigDecimal

BigDecimals是不可变的,任意精度的带符号十进制数字。
Java BigDecimal类在java.math包中定义。
这是BigDecimal类的层次结构:

Java BigDecimal还为我们提供了对比例和精度的便捷控制。
在探讨BigDecimal类之前,我们将简要讨论精度和小数位数。

Java BigDecimal精度和小数位数

根据定义,精度表示任意精度整数的长度,而小数位数表示小数点右边的位数。
例如,如果我们有一个数字" 100.25",则精度为5,因为我们需要五位数字来记下该数字,小数位数为2。

我们将看一些示例,以使您对精度和比例有一个清晰的认识。

9999/10000 = 0.9999, scale = 4 and precision = 4
1/1000 = 0.0001, scale = 4 and precision = 1
0.000, special case and precision = 1

我们可以使用构造函数以及API中可用的方法为任何BigInteger设置比例。
现在,让我们看看它如何影响数字:

9999 with scale 4 = 0.9999
9999 with scale 1 = 999.9 
9999 with scale -1 = 99990

我们可以清楚地看到该数字乘以" 10 ^ -scale"。

Java BigDecimal构造函数

有几种方法可以用Java创建BigDecimal对象。
我们将通过代码示例探索构造函数。

  • BigDecimal(BigInteger val):它将BigInteger作为参数,并从中创建一个BigDecimal对象。

类似地,该类中有可用的构造函数,它们接受int,double,long,char []以及String作为创建BigDecimal对象的参数:

  • BigDecimal(BigInteger unscaledVal,int scale):在创建对象时,我们还可以提供比例尺和值。

输出:

  • BigDecimal(BigInteger val,MathContext mc):它也使我们能够在创建对象时提供MathContext实例的控件。

基本上,它提供精确匹配的IEEE 754R格式。
以下是java.math.MathContext:MathContext.DECIMAL128的可能值?提供34位数字的精度。

  • MathContext.DECIMAL64 –提供16位精度。

  • MathContext.DECIMAL32吗?提供7位数的精度。

  • MathContext.UNLIMITED吗?提供无限的精度。

让我们看一下代码:

BigInteger bigInt = new BigInteger("233233233233");
BigDecimal bigDecimal = new BigDecimal(bigInt);

Ofcourse, it also provides similar constructors for int, long, double, char[] as well as String.- BigDecimal(BigInteger unscaledVal,int scale,MathContext mc):我们可以在构建对象时同时提供比例和精度。

Java BigDecimal方法

Java BigDecimal类为我们提供了几种执行算术运算,缩放操作,舍入,比较和格式化的方法。

请注意,我们不能使用+等运算符,因为它们不会在类中重载。
相反,它提供了实现结果的相应方法。
让我们用示例来看看BigDecimal API中提供的方法:

  • BigDecimal add(BigDecimal bigDecimal2):返回一个BigDecimal,其值是this和bigDecimal2的加法。

如您所见,从add()方法返回的对象的比例为max(this.scale,bigDecimal2)。
在我们的示例中,bigDecimal2是使用double创建的,并从中获取了比例值。

还有一个重载的add(BigDecimal bigDecimal2,MathContext mc)方法,该方法将precision作为参数并返回一个BigDecimal对象,并根据上下文设置进行舍入。

  • BigDecimal减去(BigDecimal bigDecimal2):返回一个BigDecimal,其值是this和bigDecimal2的减法。

与add()方法类似,它也具有提供MathContext实例的优先权。

  • BigDecimal setScale(int newScale,RoundingMode roundingMode):一种非常便捷而强大的方法,它使我们可以设置对象的缩放比例和舍入模式。
    我们已经讨论过规模。
    让我们简要讨论舍入模式及其可能的值:
    枚举RoundingMode提供以下可能的舍入:UP:从零舍入
  • 上限:朝正无穷大方向取整
  • 下:向零舍入
  • 地板:向负无穷大方向舍入
  • HALF_DOWN:朝着"最近的邻居"取整,除非两个邻居都等距,在这种情况下取整
  • HALF_EVEN:向"最近的邻居"舍入,除非两个邻居都等距,在这种情况下,向"偶数邻居"舍入
  • HALF_UP:朝着"最近的邻居"取整,除非两个邻居都等距,在这种情况下取整
  • 不必要:断言所请求的操作具有准确的结果,因此无需四舍五入
BigDecimal bigDecimal = new BigDecimal(5.0);

输出:

BigInteger bigInt = new BigInteger("233233233233");
int scale = 2;
BigDecimal bigDecimal = new BigDecimal(bigInt, scale);
System.out.println(bigDecimal);
  • BigInteger unscaledValue():我们还可以在任何时间获取未缩放的值。

例如,以下代码:
将使我们:
还有一个scale()方法,该方法返回BigDecimal对象的小数位数

  • BigDecimal除法(BigDecimal divisor,int roundingMode):计算this和divisor的除法,并返回具有提供的roundingMode的输出。

  • BigDecimal除法(BigDecimal除数,int缩放比例,int roundingMode):计算this和divisor的除法,并返回具有提供的roundingMode和scale的输出。

  • BigDecimalplicate(BigDecimal multiplicand):计算this和multiplicand的乘法并返回输出。

  • BigDecimal pow(int n):返回一个BigDecimal,其值为(this ^ n),精确地计算出幂,达到无限精度。

注意,对于每个运算符方法,都有一个重载方法,该方法接受MathContext对象,并以各自的精度返回输出。

Java BigDecimal示例

现在,让我们看一个示例,以检查上面的Java BigDecimal方法:

2332332332.33

输出:

BigInteger bigInt = new BigInteger("233233233233");
BigDecimal bigDecimal = new BigDecimal(bigInt, MathContext.DECIMAL32);

BigDecimal类提供了许多用于各种运算符的方法,例如min(),max()。
另外,它还提供了诸如intValue()doubleValue()longValue()之类的方法,以获取所需格式的输出。

Java BigDecimal格式

我们可以将api和java.text.NumberFormat一起使用,以将所需的格式应用于大数字。
例如,假设我们要以美元打印金额:

BigInteger bigInt = new BigInteger("233233233233");
int scale = 2;
BigDecimal bigDecimal = new BigDecimal(bigInt, scale,MathContext.DECIMAL32);

输出:

BigInteger bigInt = new BigInteger("233233233233");
int scale = 2;
BigDecimal bigDecimal = new BigDecimal(bigInt, scale);
BigDecimal bigDecimal2 = new BigDecimal(55662.3);
System.out.println(bigDecimal.add(bigDecimal2));

Java BigDecimal compareTo

Java BigDecimal类实现了Comparable接口,我们应该使用compareTo方法比较两个BigDecimal对象。

请注意,值比相等但标度不同(例如10.0和10.00)的两个BigDecimal对象被compareTo方法视为相等。

2332387994.630000000002910383045673370361328125

以上BigDecimal compareTo示例代码的输出为:

System.out.println(bigDecimal.subtract(bigDecimal2));
2332276670.029999999997089616954326629638671875

Java BigDecimal toString

Java BigDecimal toString方法根据比例值的不同而表现不同。
如果比例尺为6或者更大,则以指数符号打印。
以下是一些伪代码,用于显示具有刻度的BigDecimal值以及toString方法返回的String表示形式。

BigDecimal bigDecimal = new BigDecimal("23323323.3533");
System.out.println(bigDecimal);
System.out.println("CEILING: "+bigDecimal.setScale(2,RoundingMode.CEILING));
System.out.println("DOWN: "+bigDecimal.setScale(2,RoundingMode.DOWN));
System.out.println("FLOOR: "+bigDecimal.setScale(2,RoundingMode.FLOOR));

这是BigDecimal toString示例的简单Java示例。

23323323.3533
CEILING: 23323323.36
DOWN: 23323323.35
FLOOR: 23323323.35

上面的BigDecimal toString示例代码产生的输出是:

BigDecimal bigDecimal = new BigDecimal("23323323.3533");
System.out.println(bigDecimal);
System.out.println(bigDecimal.unscaledValue());