當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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


// 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類的方法:

  1. BigDecimal abs():該方法返回一個BigDecimal,其值為該BigDecimal的絕對值,其小數位數為this.scale()。
  2. BigDecimal abs():該方法返回一個BigDecimal,其值是此BigDecimal的絕對值,並根據上下文設置進行舍入。
  3. BigDecimal add(BigDecimal 被加數):該方法返回一個BigDecimal,其值為(this + augend),其小數位數為max(this.scale(), augend.scale())。
  4. BigDecimal add(BigDecimal 被加數, MathContext mc):該方法返回一個BigDecimal,其值為(this +被加數),根據上下文設置進行舍入。
  5. BigDecimal byteValueExact():此方法將此BigDecimal 轉換為字節,檢查丟失的信息。
  6. BigDecimal compareTo():此方法將此BigDecimal與指定的BigDecimal進行比較。
  7. BigDecimal 除法(BigDecimal 除數):該方法返回一個BigDecimal,其值為(this /divisor),其首選小數位數為(this.scale() - divisor.scale());如果無法表示精確的商(因為它具有非終止小數擴展),則會拋出ArithmeticException。
  8. BigDecimal 除法(BigDecimal 除數, int 小數位數, RoundingMode roundingMode):此方法返回一個BigDecimal,其值為(this /除數),其小數位數與指定的相同。
  9. BigDecimal 除法(BigDecimal 除數, MathContext mc):該方法返回一個BigDecimal,其值為(this /divisor),根據上下文設置進行舍入。
  10. BigDecimal 除法(BigDecimal 除數, RoundingMode roundingMode):該方法返回一個BigDecimal,其值為(this /除數),其小數位數為this.scale()。
  11. BigDecimal[] divergeAndRemainder(BigDecimal 除數):此方法返回一個二元素BigDecimal數組,其中包含divideToIntegralValue的結果,後跟兩個操作數的餘數結果。
  12. BigDecimal[] divergeAndRemainder(BigDecimal 除數, MathContext mc):此方法返回一個二元素BigDecimal數組,其中包含divideToIntegralValue的結果,後跟根據上下文設置進行舍入計算的兩個操作數的餘數結果。
  13. BigDecimaldivideToIntegralValue(BigDecimal 除數):該方法返回一個BigDecimal,其值為商(this /除數)向下舍入的整數部分。
  14. BigDecimaldivideToIntegralValue(BigDecimal除數,MathContextmc):該方法返回一個BigDecimal,其值為(this /divisor)的整數部分。
  15. BigDecimal doubleValue():此方法將此BigDecimal 轉換為雙精度值。
  16. BigDecimal equals():此方法將此BigDecimal與指定的對象進行比較是否相等。
  17. 浮點數floatValue():此方法將BigDecimal轉換為浮點數。
  18. BigDecimal hashCode():此方法返回此 BigDecimal 的哈希碼。
  19. BigDecimal intValue():該方法將BigDecimal轉換為int。
  20. BigDecimal intvalueExact():此方法將此BigDecimal轉換為int,檢查丟失的信息。
  21. BigDecimal longValue():此方法將BigDecimal轉換為long。
  22. BigDecimal longValueExact():此方法將此BigDecimal轉換為長整數,檢查丟失的信息。
  23. BigDecimal max():該方法返回BigDecimal和val的最大值。
  24. BigDecimal min():此方法返回BigDecimal 和 val 中的最小值。
  25. BigDecimal movePointLeft():該方法返回一個BigDecimal,相當於小數點向左移動了n位。
  26. BigDecimal movePointRight():該方法返回一個BigDecimal,相當於小數點向右移動了n位。
  27. BigDecimal multiply():此方法返回一個BigDecimal,其值為(this × 被乘數),其小數位數為(this.scale() + 被乘數.scale())。
  28. BigDecimal multiply():該方法返回一個BigDecimal,其值為(this×被乘數),根據上下文設置進行舍入。
  29. BigDecimal negate():該方法返回一個BigDecimal,其值為(-this),其小數位數為this.scale()。
  30. BigDecimal negate():該方法返回一個BigDecimal,其值為(-this),根據上下文設置進行舍入。
  31. BigDecimal plus():該方法返回一個BigDecimal,其值為(+this),其小數位數為this.scale()。
  32. BigDecimal plus():該方法返回一個BigDecimal,其值為(+this),根據上下文設置進行舍入。
  33. BigDecimal 戰俘(int n):該方法返回一個BigDecimal,其值為(thisn),冪的計算精確,精度不受限製。
  34. BigDecimal pow(int n, MathContext mc):該方法返回一個BigDecimal,其值為(thisn)。
  35. BigDecimal precision():此方法返回此 BigDecimal 的精度。
  36. BigDecimal 餘數(BigDecimal 除數):該方法返回一個BigDecimal,其值為(這個%除數)。
  37. BigDecimal 餘數(BigDecimal 除數, MathContext mc):此方法返回一個BigDecimal,其值為(this % 除數),根據上下文設置進行舍入。
  38. BigDecimal round():此方法返回根據MathContext 設置舍入的BigDecimal。
  39. BigDecimal scale():此方法返回此 BigDecimal 的小數位數。
  40. BigDecimal scaleByPowerOfTen():該方法返回一個BigDecimal,其數值等於(this * 10n)。
  41. BigDecimal setScale(int newScale):此方法返回一個BigDecimal,其小數位數為指定值,其值在數值上等於此 BigDecimal 的值。
  42. BigDecimal setScale(int newScale, RoundingMode roundingMode):此方法返回一個 BigDecimal,其小數位數為指定值,其未縮放值是通過將此 BigDecimal 的未縮放值乘以或除以適當的 10 次冪來確定的,以保持其整體值。
  43. BigDecimal shortValueExact():此方法將此BigDecimal 轉換為短值,檢查丟失的信息。
  44. BigDecimal signum():此方法返回此 BigDecimal 的符號函數。
  45. BigDecimal sqrt(MathContext mc):此方法返回其平方根的近似值,並根據上下文設置進行舍入。
  46. BigDecimal stripTrailingZeros():此方法返回一個 BigDecimal,它在數值上等於此值,但從表示形式中刪除了所有尾隨零。
  47. BigDecimal 減法(BigDecimal 減數):此方法返回一個BigDecimal,其值為(this - 減數),其小數位數為 max(this.scale(), subtrahend.scale())。
  48. BigDecimal 減法(BigDecimal 減數, MathContext mc):該方法返回一個BigDecimal,其值為(this - 減數),根據上下文設置進行舍入。
  49. BigDecimal toBigInteger():此方法將此BigDecimal轉換為BigInteger。
  50. BigDecimal toBigIntegerExact():此方法將此BigDecimal 轉換為 BigInteger,檢查丟失的信息。
  51. 字符串toEngineeringString():此方法返回此 BigDecimal 的字符串表示形式,如果需要指數,則使用工程符號。
  52. 字符串toPlainString():此方法返回此 BigDecimal 的字符串表示形式,不帶指數字段。
  53. 字符串toString():此方法返回此 BigDecimal 的字符串表示形式,如果需要指數,則使用科學計數法。
  54. BigDecimal ulp():此方法返回此 BigDecimal 的 ulp(最後一位的單位)的大小。
  55. BigDecimal unscaledValue():此方法返回一個 BigInteger,其值是此 BigDecimal 的未縮放值。
  56. BigDecimal valueOf():此方法使用 Double.toString(double) 方法提供的 double 規範字符串表示形式將 double 轉換為 BigDecimal。
  57. BigDecimal valueOf():此方法將長整型值轉換為小數位數為零的BigDecimal。
  58. BigDecimal valueOf():此方法將長未縮放值和 int 縮放值轉換為 BigDecimal。


相關用法


注:本文由純淨天空篩選整理自MadhuramJajoo大神的英文原創作品 BigDecimal Class in Java。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。