BigDecimal類(高精度小數)


位置:java.math.BigDecimal

作用:提供高精度小數數據類型及相關操作

一、基本介紹

  • BigDecimal為不可變的、任意精度的有符號十進制數,其值為(unscaledValue * 10-scale)其中,unscaledValue(非標度值)為任意精度的整數、scale(標度)為32位整型(可為負)
  • 提供以下操作:算術標度操作舍入比較哈希算法格式轉換
  • 用戶能通過提供MathContext對象完全控制BigDecimal的舍入行為(也可使用類內提供的8種舍入模式)。如果未指定舍入模式,並且無法表示准確結果,則拋出一個異常。
  • 由於同一數值可以有不同的表示形式(具有不同的標度),因此運算和舍入的規則必須同時指定數值結果和結果表示形式中所用的標度。
  • 一般情況下,當准確結果(在除法中,可能有無限多位)比返回的數值具有更多位數時,舍入模式和精度設置確定操作如何返回具有有限位數的結果(MathContextprecision 設置指定要返回的總位數,這確定了結果的精度、位數計數從准確結果的最左邊的非零數字開始、舍入模式確定丟棄的尾部位數如何影響返回的結果)。
  • 對於所有算術運算符,運算的執行方式是,首先計算准確的中間結果,然后,使用選擇的舍入模式將其舍入為精度設置(如有必要)指定的位數。如果不返回准確結果,則將丟棄准確結果的某些數位。當舍入增加了返回結果的大小時,前導數字“9”的進位傳播可能會創建新的數位。例如,將值 999.9 舍入為三位數字,則在數值上等於一千,表示為 100×101。在這種情況下,新的 "1" 是返回結果的前導數位。
  • 除了邏輯的准確結果外,每種算術運算都有一個表示結果的首選標度
    • 加法:max( addend.scale() , augend.scale() )  //加數與被加數中的較大者
    • 減法:max( minuend.scale() , subtrahend.scale() )  //被減數與減數之間的較大者
    • 乘法:multiplier.scale() + multiplicand.scale()  //乘數與被乘數的和
    • 除法:dividend.scale() - divisor.scale()  //被除數與除數的差

二、字段

BigDecimal常量

  1. static BigDecimal ONE  //值為 1,標度為 0
  2. static BigDecimal TEN  //值為 10,標度為 0
  3. static BigDecimal ZERO  //值為 0,標度為 0

舍入模式

  1. static int ROUND_UP   //(常量字段值0)遠離零的舍入模式(向上舍入)。舍棄某部分時,若舍棄部分非零則對其前面的數字加1(此舍入模式始終不會減少計算值的大小)
  2. static int ROUND_DOWN   //(常量字段值1)接近零的舍入模式(向下舍入)。直接丟棄需舍棄部分(此舍入模式始終不會增加計算值的大小)
  3. static int ROUND_CEILING   //(常量字段值2)接近正無窮大的舍入模式。若BigDecimal為正,則舍入行為ROUND_UP;若為負,則舍入行為ROUND_DOWN(此舍入模式始終不會減少計算值大小)
  4. static int ROUND_FLOOR   //(常量字段值3)接近負無窮大(不是無窮小哦)的舍入模式。其行為與ROUND_CEILING相反,若BigDecimal為負,則舍入行為ROUND_UP;若為正,則舍入行為ROUND_DOWN(此舍入模式始終不會增加計算值大小)
  5. static int ROUND_HALF_UP   //(常量字段值4)向“最接近的”數字舍入,如果與兩個相鄰數字的距離相等,則為向上舍入的舍入模式(四舍五入,即舍棄部分>=0.5則向上舍入,否則向下舍入
  6. static int ROUND_HALF_DOWN   //(常量字段值5)向“最接近的”數字舍入,如果與兩個相鄰數字的距離相等,則為向下舍入的舍入模式(舍棄部分<=0.5則向下舍入,否則向上舍入)
  7. static int ROUND_HALF_EVEN   //(常量字段值6)向“最接近的”數字舍入,如果與兩個相鄰數字的距離相等,則向相鄰的偶數舍入(在重復進行一系列計算時,此舍入模式可以將累加錯誤減到最小)
  8. static int ROUND_UNNECESSARY   //(常量字段值7)斷言請求的操作具有精確的結枚,因此不需要舍入,若該操作無精確結果(如1/3)拋出 ArithmeticException

三、生成BigDecimal對象

構造方法

  1. BigDecimal(String val)  //將 BigDecimal 的字符串表示形式轉換為 BigDecimal(可為科學計數法表示、可帶前導負號),其標度值為字符串的小數部分數字位數(沒有小數點則標度為0)
  2. BigDecimal(String val, MathContext mc)  //將 BigDecimal 的字符串表示形式轉換為 BigDecimal,接受與 BigDecimal(String) 構造方法相同的字符串,並按照上下文設置進行舍入
  3. BigDecimal(BigInteger val)  //將 BigInteger 轉換為 BigDecimal(其標度為0)
  4. BigDecimal(BigInteger val, MathContext mc)  //將 BigInteger 轉換為 BigDecimal(其標度為0),並根據上下文設置進行舍入
  5. BigDecimal(BigInteger unscaledVal, int scale)  //將 BigInteger 非標度值和 int 標度轉換為 BigDecimal
  6. BigDecimal(BigInteger unscaledVal, int scale, MathContext mc)  //將 BigInteger 非標度值和 int 標度轉換為 BigDecimal,並根據上下文設置進行舍入
  7. BigDecimal(char[] in)  //將 BigDecimal 的字符數組表示形式轉換為 BigDecimal,接受與 BigDecimal(String) 構造方法相同的字符序列(如果字符序列已經可以作為一個字符數組使用,則使用此構造方法要比將 char 數組轉換為字符串並使用 BigDecimal(String) 構造方法更快)
  8. BigDecimal(char[] in, MathContext mc)  //將 BigDecimal 的字符數組表示形式轉換為 BigDecimal,接受與 BigDecimal(String) 構造方法相同的字符序列,並根據上下文設置進行舍入
  9. BigDecimal(char[] in, int offset, int len)  //將 BigDecimal 的字符數組表示形式轉換為 BigDecimal,接受與 BigDecimal(String) 構造方法相同的字符序列,允許指定子數組(以offset為起始,長len)
  10. BigDecimal(char[] in, int offset, int len, MathContext mc)  //將 BigDecimal 的字符數組表示形式轉換為 BigDecimal,允許指定子數組(以offset為起始,長len),並根據上下文設置進行舍入
  11. BigDecimal(int val)  //將 int 轉換為 BigDecimal,其標度為0
  12. BigDecimal(int val, MathContext mc)  //將 int 轉換為 BigDecimal,並根據上下文設置進行舍入,在進行任何舍入之前,BigDecimal的標度為零
  13. BigDecimal(long val)  //將 long 轉換為 BigDecimal,其標度為0
  14. BigDecimal(long val, MathContext mc)  //將 long 轉換為 BigDecimal,並根據上下文設置進行舍入,在進行任何舍入之前,BigDecimal的標度為零
  15. BigDecimal(double val)  //將 double 轉換為 BigDecimal,后者是 double 的二進制浮點值准確的十進制表示形式(由於dounle無法精確表示浮點數,需要以double為參數構造BigDecimal時請先用toString()將double轉為字符串,再用該字符串構造BigDecimal,下同)
  16. BigDecimal(double val, MathContext mc)  //將 double 轉換為 BigDecimal,並根據上下文設置進行舍入(處理方式同上)。

四、常(suo)用(you)方法

算術運算(+ - * / % mod)

  1. BigDecimal add(BigDecimal augend)  //返回其值為 (this + augend)  BigDecimal其標度為 max( this.scale() , augend.scale() )
  2. BigDecimal add(BigDecimal augend , MathContext mc)  //返回其值為 (this + augend) BigDecimal,並根據上下文設置進行舍入
  3. BigDecimal subtract(BigDecimal subtrahend)  //返回其值為 (this - subtrahend)  BigDecimal,其標度為 max(this.scale(), subtrahend.scale())
  4. BigDecimal subtract(BigDecimal subtrahend , MathContext mc)  //返回其值為 (this - subtrahend) BigDecimal,並根據上下文設置進行舍入 
  5. BigDecimal multiply(BigDecimal multiplicand)  //返回其值為 (this × multiplicand)  BigDecimal,其標度為 ( this.scale() + multiplicand.scale() )
  6. BigDecimal multiply(BigDecimal multiplicand, MathContext mc)  //返回其值為 (this × multiplicand) BigDecimal,並根據上下文設置進行舍入
  7. BigDecimal divide(BigDecimal divisor)  //返回其值為 (this / divisor)  BigDecimal,其首選標度為 (this.scale() - divisor.scale())。如果無法表示准確的商值(因為它有無窮的十進制擴展),則拋出 ArithmeticException
  8. BigDecimal divide(BigDecimal divisor, MathContext mc)  //返回其值為 (this / divisor)  BigDecimal,並根據上下文設置進行舍入
  9. BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode)  //返回其值為 (this / divisor)  BigDecimal,其標度為 this.scale() ,如果必須執行舍入以生成具有指定標度的結果,則應用指定的舍入模式
  10. BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)  //返回其值為 (this / divisor)  BigDecimal,其標度為指定標度
  11. BigDecimal divide(BigDecimal divisor, int roundingMode)  //(遺留的方法)返回其值為 (this / divisor)  BigDecimal,其標度為 this.scale()
  12. BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)  //(遺留的方法)返回其值為 (this / divisor)  BigDecimal,其標度為指定標度
  13. BigDecimal divideToIntegralValue(BigDecimal divisor)  //返回 BigDecimal,其值為向下舍入所得商值 (this / divisor) 的整數部分,其首選標度為 (this.scale() - divisor.scale())
  14. BigDecimal divideToIntegralValue(BigDecimal divisor, MathContext mc)  //返回 BigDecimal,其值為 (this / divisor) 的整數部分,其首選標度為 (this.scale() - divisor.scale())。因為准確商值的整數部分與舍入模式無關,所以舍入模式不影響此方法返回的值)
  15. BigDecimal remainder(BigDecimal divisor)  //返回其值為 (this % divisor) BigDecimal,余數由this.subtract(this.divideToIntegralValue(divisor).multiply(divisor)) 給出。注意,這不是模操作(結果可以為負)
  16. BigDecimal remainder(BigDecimal divisor, MathContext mc)  //返回其值為 (this % divisor) BigDecimal(根據上下文設置進行舍入) 。MathContext 設置會影響用於計算余數的隱式除法。余數計算本身要進行准確的定義。因此,余數包含的數字個數可能多於 mc.getPrecision()在進行任何舍入之前,BigDecimal 的標度為零
  17. BigDecimal[] divideAndRemainder(BigDecimal divisor)  //返回由兩個元素組成的 BigDecimal 數組,該數組包含 divideToIntegralValue 的結果,后跟對兩個操作數計算所得到的 remainder
  18. BigDecimal[] divideAndRemainder(BigDecimal divisor, MathContext mc)  //返回由兩個元素組成的 BigDecimal 數組,該數組包含 divideToIntegralValue 的結果,后跟對兩個操作數計算所得到的 remainder

比較運算

  1. int compareTo(BigDecimal val)  //將此 BigDecimal 與指定的 BigDecimal 比較,使用方法:(a.compareTo(b) <op> 0) ,<op>為6個比較運算符之一(值相等但標度不同的兩個BigDecimal被認為是相等的)
  2. boolean equals(Object x)  //比較此 BigDecimal 與指定的 Object 的相等性,當且僅當兩個元素同為BigDecimal且二者值與標度都相同時才為真(2.0!=2.00)

數學運算

  1. BigDecimal abs()  //返回 BigDecimal,其值為此 BigDecimal 的絕對值,其標度為 this.scale()
  2. BigDecimal abs(MathContext mc)  //返回其值為此 BigDecimal 絕對值的 BigDecimal(根據上下文設置進行舍入)
  3. BigDecimal pow(int n)  //返回其值為 (thisn) 的 BigDecimal,准確計算該冪,使其具有無限精度
  4. BigDecimal pow(int n, MathContext mc)  //返回其值為 (thisn) 的 BigDecimal(根據上下文設置進行舍入) 
  5. BigDecimal scaleByPowerOfTen(int n)  //返回其數值等於 (this * 10n) 的 BigDecimal,其標度為( this.scale() - n )
  6. BigDecimal max(BigDecimal val)  //返回此 BigDecimal 和 val 的最大值(相等返回this,下同)
  7. BigDecimal min(BigDecimal val)  //返回此 BigDecimal 和 val 的最小值
  8. int hashCode()  //返回此 BigDecimal 的哈希碼(標度不同但值相同的兩個數通常具有不同的哈希碼)

與BigDecimal自身相關方法(由於BigDecimal不可變,所有方法均生成一個新BigDecimal而非改變原值)

  1. BigDecimal movePointLeft(int n)  //返回一個 BigDecimal,其值為 (this × 10-n),標度為 max(this.scale()+n, 0)。它等效於將該值的小數點向左移動 n 位,若n<0,該調用等效於movePointRight( abs(n) ) 
  2. BigDecimal movePointRight(int n)  //返回一個 BigDecimal,其值為 (this × 10n),標度為 max(this.scale()-n, 0)。它等效於將該值的小數點向右移動 n 位,若n<0,該調用等效於movePointLeft( abs(n) ) 
  3. BigDecimal negate()  //返回其值為 (-this) 的 BigDecimal,其標度為 this.scale()
  4. BigDecimal negate(MathContext mc)  //返回其值為 (-this) 的 BigDecimal(根據上下文設置進行舍入)
  5. BigDecimal plus()  //返回其值為 (+this) 的 BigDecimal,其標度為 this.scale()
  6. BigDecimal plus(MathContext mc)  //返回其值為 (+this) 的 BigDecimal(根據上下文設置進行舍入)
  7. BigDecimal round(MathContext mc)  //返回根據 MathContext 設置進行舍入后的 BigDecimal
  8. BigDecimal stripTrailingZeros()  //返回數值上等於此小數,但從該表示形式移除所有尾部零的 BigDecimal
  9. BigDecimal setScale(int newScale)  //返回一個 BigDecimal,其標度為指定值,其值在數值上等於此 BigDecimal 的值
  10. BigDecimal setScale(int newScale, int roundingMode)  //返回一個 BigDecimal,其標度為指定值,其非標度值通過此 BigDecimal 的非標度值乘以或除以十的適當次冪來確定,以維護其總值
  11. BigDecimal setScale(int newScale, RoundingMode roundingMode)  //返回 BigDecimal,其標度為指定值,其非標度值通過此 BigDecimal 的非標度值乘以或除以十的適當次冪來確定,以維護其總值
  12. int scale()  //返回此 BigDecimal 的標度
  13. int precision()  //返回此 BigDecimal 的精度 
  14. int signum()  //返回此 BigDecimal 的正負號函數
  15. BigDecimal ulp()  //返回此 BigDecimal 的 ulp(最后一位的單位)的大小

BigDecimal與其他類型轉換

  1. static BigDecimal valueOf(double val)  //使用 Double.toString(double) 方法提供的 double 規范的字符串表示形式將 double 轉換為 BigDecimal
  2. static BigDecimal valueOf(long val)  //將 long 值轉換為具有零標度的 BigDecimal
  3. static BigDecimal valueOf(long unscaledVal, int scale)  //將 long 非標度值和 int 標度轉換為 BigDecimal
  4. byte byteValueExact()  //將此BigDecimal 轉換為 byte,若BigDecimal含有小數部分或其值過大(超出byte),則拋出異常
  5. short shortValueExact()  //將此BigDecimal 轉換為 short,若BigDecimal含有小數部分或其值過大(超出short),則拋出異常
  6. int intValue()  //將此BigDecimal 轉換為 int,其行為類似於double想short的轉換
  7. int intValueExact()  //將此BigDecimal 轉換為 int,若BigDecimal含有小數部分或其值過大(超出int),則拋出異常
  8. long longValue()  //將此BigDecimal 轉換為 long
  9. long longValueExact()  //將此BigDecimal 轉換為 long,若BigDecimal含有小數部分或其值過大(超出long),則拋出異常
  10. BigInteger toBigInteger()  //將此BigDecimal 轉換為 BigInteger
  11. BigInteger toBigIntegerExact()  //將此BigDecimal 轉換為 BigInteger,若BigDecimal含有小數部分,則拋出異常
  12. BigInteger unscaledValue()  //返回其值為此BigDecimal 的非標度值的 BigInteger
  13. float floatValue()  //將此 BigDecimal 轉換為 float,其行為類似於double向float的轉換
  14. double doubleValue()  //將此 BigDecimal 轉換為 double ,其行為類似於double向float的轉換
  15. String toString()  //返回此 BigDecimal 的字符串表示形式,如果需要指數,則使用科學記數法
  16. String toEngineeringString()  //返回此 BigDecimal 的字符串表示形式,需要指數時,則使用工程計數法
  17. String toPlainString()  //返回不帶指數字段的此 BigDecimal 的字符串表示形式

 

JAVA API:https://docs.oracle.com/javase/7/docs/api/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM