Java BigDecimal
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());