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
// 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():该方法返回一个BigDecimal,其值是此BigDecimal的绝对值,并根据上下文设置进行舍入。
- BigDecimal add(BigDecimal 被加数):该方法返回一个BigDecimal,其值为(this + augend),其小数位数为max(this.scale(), augend.scale())。
- BigDecimal add(BigDecimal 被加数, MathContext mc):该方法返回一个BigDecimal,其值为(this +被加数),根据上下文设置进行舍入。
- BigDecimal byteValueExact():此方法将此BigDecimal 转换为字节,检查丢失的信息。
- BigDecimal compareTo():此方法将此BigDecimal与指定的BigDecimal进行比较。
- BigDecimal 除法(BigDecimal 除数):该方法返回一个BigDecimal,其值为(this /divisor),其首选小数位数为(this.scale() - divisor.scale());如果无法表示精确的商(因为它具有非终止小数扩展),则会抛出ArithmeticException。
- BigDecimal 除法(BigDecimal 除数, int 小数位数, RoundingMode roundingMode):此方法返回一个BigDecimal,其值为(this /除数),其小数位数与指定的相同。
- BigDecimal 除法(BigDecimal 除数, MathContext mc):该方法返回一个BigDecimal,其值为(this /divisor),根据上下文设置进行舍入。
- BigDecimal 除法(BigDecimal 除数, RoundingMode roundingMode):该方法返回一个BigDecimal,其值为(this /除数),其小数位数为this.scale()。
- BigDecimal[] divergeAndRemainder(BigDecimal 除数):此方法返回一个二元素BigDecimal数组,其中包含divideToIntegralValue的结果,后跟两个操作数的余数结果。
- BigDecimal[] divergeAndRemainder(BigDecimal 除数, MathContext mc):此方法返回一个二元素BigDecimal数组,其中包含divideToIntegralValue的结果,后跟根据上下文设置进行舍入计算的两个操作数的余数结果。
- BigDecimaldivideToIntegralValue(BigDecimal 除数):该方法返回一个BigDecimal,其值为商(this /除数)向下舍入的整数部分。
- BigDecimaldivideToIntegralValue(BigDecimal除数,MathContextmc):该方法返回一个BigDecimal,其值为(this /divisor)的整数部分。
- BigDecimal doubleValue():此方法将此BigDecimal 转换为双精度值。
- BigDecimal equals():此方法将此BigDecimal与指定的对象进行比较是否相等。
- 浮点数floatValue():此方法将BigDecimal转换为浮点数。
- BigDecimal hashCode():此方法返回此 BigDecimal 的哈希码。
- BigDecimal intValue():该方法将BigDecimal转换为int。
- BigDecimal intvalueExact():此方法将此BigDecimal转换为int,检查丢失的信息。
- BigDecimal longValue():此方法将BigDecimal转换为long。
- BigDecimal longValueExact():此方法将此BigDecimal转换为长整数,检查丢失的信息。
- BigDecimal max():该方法返回BigDecimal和val的最大值。
- BigDecimal min():此方法返回BigDecimal 和 val 中的最小值。
- BigDecimal movePointLeft():该方法返回一个BigDecimal,相当于小数点向左移动了n位。
- BigDecimal movePointRight():该方法返回一个BigDecimal,相当于小数点向右移动了n位。
- BigDecimal multiply():此方法返回一个BigDecimal,其值为(this × 被乘数),其小数位数为(this.scale() + 被乘数.scale())。
- BigDecimal multiply():该方法返回一个BigDecimal,其值为(this×被乘数),根据上下文设置进行舍入。
- BigDecimal negate():该方法返回一个BigDecimal,其值为(-this),其小数位数为this.scale()。
- BigDecimal negate():该方法返回一个BigDecimal,其值为(-this),根据上下文设置进行舍入。
- BigDecimal plus():该方法返回一个BigDecimal,其值为(+this),其小数位数为this.scale()。
- BigDecimal plus():该方法返回一个BigDecimal,其值为(+this),根据上下文设置进行舍入。
- BigDecimal 战俘(int n):该方法返回一个BigDecimal,其值为(thisn),幂的计算精确,精度不受限制。
- BigDecimal pow(int n, MathContext mc):该方法返回一个BigDecimal,其值为(thisn)。
- BigDecimal precision():此方法返回此 BigDecimal 的精度。
- BigDecimal 余数(BigDecimal 除数):该方法返回一个BigDecimal,其值为(这个%除数)。
- BigDecimal 余数(BigDecimal 除数, MathContext mc):此方法返回一个BigDecimal,其值为(this % 除数),根据上下文设置进行舍入。
- BigDecimal round():此方法返回根据MathContext 设置舍入的BigDecimal。
- BigDecimal scale():此方法返回此 BigDecimal 的小数位数。
- BigDecimal scaleByPowerOfTen():该方法返回一个BigDecimal,其数值等于(this * 10n)。
- BigDecimal setScale(int newScale):此方法返回一个BigDecimal,其小数位数为指定值,其值在数值上等于此 BigDecimal 的值。
- BigDecimal setScale(int newScale, RoundingMode roundingMode):此方法返回一个 BigDecimal,其小数位数为指定值,其未缩放值是通过将此 BigDecimal 的未缩放值乘以或除以适当的 10 次幂来确定的,以保持其整体值。
- BigDecimal shortValueExact():此方法将此BigDecimal 转换为短值,检查丢失的信息。
- BigDecimal signum():此方法返回此 BigDecimal 的符号函数。
- BigDecimal sqrt(MathContext mc):此方法返回其平方根的近似值,并根据上下文设置进行舍入。
- BigDecimal stripTrailingZeros():此方法返回一个 BigDecimal,它在数值上等于此值,但从表示形式中删除了所有尾随零。
- BigDecimal 减法(BigDecimal 减数):此方法返回一个BigDecimal,其值为(this - 减数),其小数位数为 max(this.scale(), subtrahend.scale())。
- BigDecimal 减法(BigDecimal 减数, MathContext mc):该方法返回一个BigDecimal,其值为(this - 减数),根据上下文设置进行舍入。
- BigDecimal toBigInteger():此方法将此BigDecimal转换为BigInteger。
- BigDecimal toBigIntegerExact():此方法将此BigDecimal 转换为 BigInteger,检查丢失的信息。
- 字符串toEngineeringString():此方法返回此 BigDecimal 的字符串表示形式,如果需要指数,则使用工程符号。
- 字符串toPlainString():此方法返回此 BigDecimal 的字符串表示形式,不带指数字段。
- 字符串toString():此方法返回此 BigDecimal 的字符串表示形式,如果需要指数,则使用科学计数法。
- BigDecimal ulp():此方法返回此 BigDecimal 的 ulp(最后一位的单位)的大小。
- BigDecimal unscaledValue():此方法返回一个 BigInteger,其值是此 BigDecimal 的未缩放值。
- BigDecimal valueOf():此方法使用 Double.toString(double) 方法提供的 double 规范字符串表示形式将 double 转换为 BigDecimal。
- BigDecimal valueOf():此方法将长整型值转换为小数位数为零的BigDecimal。
- BigDecimal valueOf():此方法将长未缩放值和 int 缩放值转换为 BigDecimal。
相关用法
- Java BigDecimal intValueExact()用法及代码示例
- Java BigDecimal abs()用法及代码示例
- Java BigDecimal add()用法及代码示例
- Java BigDecimal byteValueExact()用法及代码示例
- Java BigDecimal divide()用法及代码示例
- Java BigDecimal divideAndRemainder()用法及代码示例
- Java BigDecimal divideToIntegralValue()用法及代码示例
- Java BigDecimal doubleValue()用法及代码示例
- Java BigDecimal equals()用法及代码示例
- Java BigDecimal floatValue()用法及代码示例
- Java BigDecimal hashCode()用法及代码示例
- Java BigDecimal intValue()用法及代码示例
- Java BigDecimal intvalueExact()用法及代码示例
- Java BigDecimal longValue()用法及代码示例
- Java BigDecimal longValueExact()用法及代码示例
- Java BigDecimal max()用法及代码示例
- Java BigDecimal min()用法及代码示例
- Java BigDecimal movePointLeft()用法及代码示例
- Java BigDecimal movePointRight()用法及代码示例
- Java BigDecimal multiply()用法及代码示例
- Java BigDecimal plus()用法及代码示例
- Java BigDecimal pow()用法及代码示例
- Java BigDecimal precision()用法及代码示例
- Java BigDecimal remainder()用法及代码示例
- Java BigDecimal round()用法及代码示例
注:本文由纯净天空筛选整理自MadhuramJajoo大神的英文原创作品 BigDecimal Class in Java。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。