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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。