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.009999999999999998 作为 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),根据上下文设置进行四舍五入。
- 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 数组,其中包含 divideToIntegralValue 的结果,后跟两个操作数的余数结果。
- BigDecimal[] divideAndRemainder(BigDecimal divisor, MathContext mc) :此方法返回一个二元素 BigDecimal 数组,其中包含 divideToIntegralValue 的结果,后跟根据上下文设置通过舍入计算的两个操作数的余数结果。
- BigDecimal divideToIntegralValue(BigDecimal divisor) :此方法返回一个 BigDecimal,其值为四舍五入的商(this / divisor)的整数部分。
- BigDecimal divideToIntegralValue(BigDecimal divisor, MathContext mc) :此方法返回一个 BigDecimal,其值为 (this / divisor) 的整数部分。
- double doubleValue() :此方法将此 BigDecimal 转换为双精度值。
- boolean equals(Object x) :此方法将此 BigDecimal 与指定的 Object 进行比较是否相等。
- float floatValue() :此方法将此 BigDecimal 转换为浮点数。
- int hashCode() :此方法返回此 BigDecimal 的哈希码。
- int intValue() :此方法将此 BigDecimal 转换为 int。
- int intValueExact() :此方法将此 BigDecimal 转换为 int,检查丢失的信息。
- long longValue() :此方法将此 BigDecimal 转换为 long。
- long longValueExact() :此方法将此 BigDecimal 转换为 long,检查丢失的信息。
- BigDecimal max(BigDecimal val) :此方法返回此 BigDecimal 和 val 的最大值。
- BigDecimal min(BigDecimal val) :此方法返回此 BigDecimal 和 val 的最小值。
- BigDecimal movePointLeft(int n) :此方法返回一个 BigDecimal,它等效于将小数点向左移动 n 位的这个。
- BigDecimal movePointRight(int n) :此方法返回一个 BigDecimal,它相当于将小数点向右移动 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) :此方法返回一个值为 (+this) 的 BigDecimal,根据上下文设置进行四舍五入。
- BigDecimal pow(int n) :此方法返回一个 BigDecimal,其值为 (thisn),幂计算精确,精度不受限制。
- BigDecimal pow(int n, MathContext mc) :此方法返回一个 BigDecimal,其值为 (thisn)。
- int precision() :此方法返回此 BigDecimal 的精度。
- BigDecimal 余数(BigDecimal divisor) :此方法返回一个 BigDecimal,其值为 (this % divisor)。
- BigDecimal 余数(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 setScale(int newScale, RoundingMode roundingMode) :此方法返回一个 BigDecimal,其刻度为指定值,其未缩放值通过将此 BigDecimal 的未缩放值乘以或除以适当的 10 次方来确定,以保持其整体值。
- short shortValueExact() :此方法将此 BigDecimal 转换为 short,检查丢失的信息。
- int signum() :此方法返回此 BigDecimal 的符号函数。
- BigDecimal sqrt(MathContext mc) :此方法返回平方根的近似值,并根据上下文设置进行舍入。
- BigDecimal stripTrailingZeros() :此方法返回一个 BigDecimal,它在数值上等于这个值,但从表示中删除了任何尾随零。
- BigDecimal subtrahend(BigDecimal subtrahend) :此方法返回一个 BigDecimal,其值为 (this – subtrahend),其标度为 max(this.scale(), subtrahend.scale())。
- BigDecimal subtrahend(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) 方法提供的 double 的规范字符串表示形式将 double 转换为 BigDecimal。
- static BigDecimal valueOf(long val) :此方法将 long 值转换为比例为零的 BigDecimal。
- static BigDecimal valueOf(long unscaledVal, int scale) :此方法将 long unscaled 值和 int scale 转换为 BigDecimal。
有关更多示例,请访问Java BigDecimal 示例
相关文章:
有关更多功能和详细信息,请参阅Class BigDecimal