Java BigDecimal类
BigDecimal类提供了对双数的运算、比例处理、四舍五入、比较、格式转换和散列的操作。它可以非常精确地处理非常大和非常小的浮点数,但在时间复杂度上有一点补偿。
一个BigDecimal由一个随机精度的未标定的整数值和一个32位的整数刻度组成。如果大于或等于零,刻度就是小数点右边的数字。如果小于零,则该数字的未标度值要乘以10^(-scale)。
例子。
Input : double a=0.03;
double b=0.04;
double c=b-a;
System.out.println(c);
Output :0.009999999999999998
Input : BigDecimal _a = new BigDecimal("0.03");
BigDecimal _b = new BigDecimal("0.04");
BigDecimal _c = _b.subtract(_a);
System.out.println(_c);
Output :0.01
对 BigDecimal的需求
- java的两种原始类型(double和float)是浮点数,它被存储为分数和指数的二进制表示。
- 其他原始类型(除了布尔型)都是定点数字。与定点数不同的是,浮点数在大多数情况下都会返回一个有小误差的答案(大约10^-19),这就是为什么在上面的例子中,我们最终以0.00999999999998作为0.04-0.03的结果。
但是BigDecimal却为我们提供了准确的答案。
// Java Program to illustrate BigDecimal Class
import java.math.BigDecimal;
public class BigDecimalExample
{
public static void main(String[] args)
{
// Create two new BigDecimals
BigDecimal bd1 =
new BigDecimal("124567890.0987654321");
BigDecimal bd2 =
new BigDecimal("987654321.123456789");
// Addition of two BigDecimals
bd1 = bd1.add(bd2);
System.out.println("BigDecimal1 = " + bd1);
// Multiplication of two BigDecimals
bd1 = bd1.multiply(bd2);
System.out.println("BigDecimal1 = " + bd1);
// Subtraction of two BigDecimals
bd1 = bd1.subtract(bd2);
System.out.println("BigDecimal1 = " + bd1);
// Division of two BigDecimals
bd1 = bd1.divide(bd2);
System.out.println("BigDecimal1 = " + bd1);
// BigDecima1 raised to the power of 2
bd1 = bd1.pow(2);
System.out.println("BigDecimal1 = " + bd1);
// Negate value of BigDecimal1
bd1 = bd1.negate();
System.out.println("BigDecimal1 = " + bd1);
}
}
输出:-
BigDecimal1 = 1112222211.2222222211
BigDecimal1 = 1098491072963113850.7436076939614540479
BigDecimal1 = 1098491071975459529.6201509049614540479
BigDecimal1 = 1112222210.2222222211
BigDecimal1 = 1237038244911605079.77528397755061728521
BigDecimal1 = -1237038244911605079.77528397755061728521
声明
double a, b;
BigDecimal A, B;
初始化 。
a = 5.4;
b = 2.3;
A = BigDecimal.valueOf(5.4);
B = BigDecimal.valueOf(2.3);
如果给你一个双数的字符串表示,那么你可以用以下方式初始化。
A = new BigDecimal(“5.4”);
B = new BigDecimal(“1238126387123.1234”);
为了便于初始化,BigDecimal类有一些预定义的常量。
A = BigDecimal.ONE;
// Other than this, available constants
// are BigDecimal.ZERO and BigDecimal.TEN
数学运算 。
int c = a + b;
BigDecimal C = A.add(B);
Other similar function are subtract() , multiply(), divide(), pow()
但是所有这些函数,除了pow()以整数为参数外,都以BigDecimal为参数,所以如果我们想对小数或字符串进行这些操作,在将它们传递给函数之前,先将它们转换成BigDecimal,如下图所示。
String str = “123456789.123456789”;
BigDecimal C = A.add(new BigBigDecimal(str));
double val = 123456789.123456789;
BigDecimal C = A.add(BigDecimal.valueOf(val));
从BigDecimal中提取数值 。
// value should be in limit of double x
double x = A.doubleValue();
// To get string representation of BigDecimal A
String z = A.toString();
比较 。
if (a < b) {} // For primitive double
if (A.compareTo(B) < 0) {} // For BigDecimal
实际上compareTo根据数值返回-1(小于),0(相等),1(大于)。
对于平等,我们也可以使用。
if (A.equals(B)) {} // A is equal to B
BigDecimal类的方法。
- BigDecimal abs() : 该方法返回一个BigDecimal,其值是这个BigDecimal的绝对值,其比例是this.scale()。
- BigDecimal abs(MathContext mc) 。该方法返回一个BigDecimal,其值是这个BigDecimal的绝对值,并根据上下文设置进行舍入。
- BigDecimal add(BigDecimal augend) 。该方法返回一个BigDecimal,其值为(this + augend),其比例为max(this.scale(), augend.scale())。
- BigDecimal add(BigDecimal augend, MathContext mc) : 该方法返回一个BigDecimal,其值为(this + augend),并根据上下文设置进行四舍五入。
5.byte byteValueExact() 。该方法将BigDecimal转换为一个字节,并检查是否有丢失的信息。 - int compareTo(BigDecimal val) 。该方法将这个BigDecimal与指定的BigDecimal进行比较。
- BigDecimal divide(BigDecimal divisor) 。该方法返回一个BigDecimal,其值为(this / divisor),其首选比例为(this.scale() – divisor.scale());如果不能表示精确的商(因为它有一个非终止的小数扩展),将抛出ArithmeticException。
- BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) : 该方法返回一个BigDecimal,其值为(this / divisor),其比例为指定值。
- BigDecimal divide(BigDecimal divisor, MathContext mc) 。该方法返回一个BigDecimal,其值为(this / divisor),并根据上下文设置进行舍入。
- BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode) 。本方法返回一个BigDecimal,其值为(this / divisor),其比例为this.scale()。
- BigDecimal[] divideAndRemainder(BigDecimal divisor) : 该方法返回一个两元素的BigDecimal数组,其中包含除以整数的结果,以及两个操作数的余数结果。
- BigDecimal[] divideAndRemainder(BigDecimal divisor, MathContext mc) 。该方法返回一个两元素的BigDecimal数组,其中包含除以积分的结果和两个操作数的余数,余数是根据上下文设置进行四舍五入计算的。
- BigDecimal divideToIntegralValue(BigDecimal divisor) 。该方法返回一个BigDecimal,其值为商的整数部分(本数/除数),并向下舍入。
- BigDecimal divideToIntegralValue(BigDecimal divisor, MathContext mc) 。该方法返回一个BigDecimal,其值是(this / divisor)的整数部分。
double doubleValue() 。该方法将BigDecimal转换为双数。 - boolean equals(Object x) 。该方法将BigDecimal与指定的Object进行比较,以确定是否相等。
float floatValue() : 这个方法将BigDecimal转换为双数。该方法将BigDecimal转换为浮点数。 - int hashCode() 。该方法返回BigDecimal的哈希代码。
intValue() 。该方法将BigDecimal转换为int。
intValueExact() 。该方法将BigDecimal转换为int,并检查是否有丢失的信息。
longValue()。此方法将BigDecimal转换为long。
longValueExact() 。此方法将BigDecimal转换为long,并检查是否有丢失信息。 - BigDecimal max(BigDecimal val) : 该方法返回这个BigDecimal和val的最大值。
- BigDecimal min(BigDecimal val) 。此方法返回此BigDecimal和val的最小值。
- BigDecimal movePointLeft(int n) 。该方法返回一个小数点向左移动了n位的BigDecimal,与该BigDecimal等价。
- BigDecimal movePointRight(int n) : 该方法返回一个小数点向右移动了n位的BigDecimal,与该方法等价。
- BigDecimal multiply(BigDecimal multiplicand) : 该方法返回一个BigDecimal,其值为(this × multiplicand),其比例为(this.scale() + multiplicand.scale())。
- BigDecimal multiply(BigDecimal multiplicand, MathContext mc) 。该方法返回一个BigDecimal,其值为(this × multiplicand),并根据上下文设置进行四舍五入。
- BigDecimal negate() 。该方法返回一个BigDecimal,其值为(-this),其比例为this.scale()。
- BigDecimal negate(MathContext mc) : 该方法返回一个BigDecimal,其值为(-this),并根据上下文的设置进行四舍五入。
- BigDecimal plus() : 该方法返回一个BigDecimal,其值为(+this),其比例为this.scale()。
- BigDecimal plus(MathContext mc) : 该方法返回一个BigDecimal,其值为(+this),并根据上下文设置进行舍入。
- BigDecimal pow(int n) : 该方法返回一个BigDecimal,其值为(thisn),功率的计算是精确的,不受精度限制。
- BigDecimal pow(int n, MathContext mc) : 该方法返回一个BigDecimal,其值为(thisn)。
- int precision() 。该方法返回该BigDecimal的精度。
- BigDecimal remainder(BigDecimal divisor) 。该方法返回一个BigDecimal,其值为(this % divisor)。
- BigDecimal remainder(BigDecimal divisor, MathContext mc) 。该方法返回一个BigDecimal,其值为(this % divisor),并根据上下文设置进行四舍五入。
- BigDecimal round(MathContext mc) 。该方法返回一个根据MathContext设置四舍五入的BigDecimal。
- int scale() 。该方法返回该BigDecimal的比例。
- BigDecimal scaleByPowerOfTen(int n) 。该方法返回一个BigDecimal,其数值等于(this * 10n)。
- BigDecimal setScale(int newScale) : 该方法返回一个BigDecimal,该BigDecimal的刻度是指定的值,并且其数值等于这个BigDecimal的数值。
- BigDecimal setScale(int newScale, RoundingMode roundingMode) : 该方法返回一个BigDecimal,其刻度是指定的值,其非刻度值是通过将这个BigDecimal的非刻度值乘以或除以适当的10次方,以保持其整体值。
- short shortValueExact() 。该方法将这个BigDecimal转换为short,检查是否有丢失的信息。
- int signum() 。该方法返回这个BigDecimal的符号函数。
- BigDecimal sqrt(MathContext mc) : 本方法根据上下文的设置,返回一个近似的平方根值。
- BigDecimal stripTrailingZeros() 。该方法返回一个BigDecimal,该BigDecimal在数字上等于这个BigDecimal,但是在表示上去掉了任何尾部的零。
- BigDecimal subtract(BigDecimal subtrahend) : 该方法返回一个BigDecimal,其值为(this – subtrahend),其比例为max(this.scale(), subtrahend.scale())。
- BigDecimal subtract(BigDecimal subtrahend, MathContext mc) 。该方法返回一个BigDecimal,其值为(this – subtrahend),并根据上下文设置进行舍入。
- BigInteger toBigInteger() 。该方法将BigDecimal转换为BigInteger。
- BigInteger toBigIntegerExact() : 该方法将BigDecimal转换为BigInteger,并检查是否有丢失的信息。
- String toEngineeringString() 。该方法返回该BigDecimal的字符串表示,如果需要指数,则使用工程记数法。
- String toPlainString() : 该方法返回该BigDecimal的字符串表示,不含指数域。
- String toString() : 该方法返回该BigDecimal的字符串表示,如果需要指数,则使用科学计数法。
- BigDecimal ulp() : 该方法返回这个BigDecimal的一个ulp的大小,即最后一位的单位。
- BigInteger unscaledValue() : 该方法返回一个BigInteger,其值为该BigDecimal的未缩放值。
- static BigDecimal valueOf(double val) 。该方法使用Double.toString(double)方法提供的双倍数的典型字符串表示法,将双倍数转换为大十进制。
- static BigDecimal valueOf(long val) 。该方法将一个长的数值转化为比例为0的BigDecimal。
58.静态BigDecimal valueOf(long unscaledVal, int scale) 。该方法将一个未标定的长数值和一个int scale翻译成BigDecimal。