BigDecimal 小數 浮點數 精度 財務計算


簡介

float和double類型的使用局限:
  • 精度浮點型變量float可以處理6~7位有效數雙精度浮點型變量double可以處理15~16位有效數,在實際應用中,如果需要對更大或者更小的數進行運算和處理,這時候float和double就如能為力了
  • 借用《Effactive Java》這本書中的話,float和double類型的主要設計目標是為了科學計算和工程計算,他們執行二進制浮點運算,這是為了在廣域數值范圍上提供較為精確快速近似計算而精心設計的。然而,它們沒有提供完全精確的結果,所以不應該被用於要求精確結果的場合。但是,商業計算往往要求結果精確,這時候BigDecimal就派上大用場啦。

BigDecimal
public class BigDecimal extends Number implements Comparable<BigDecimal>
BigDecimal用來對超過 16位有效位 的數進行精確的運算。BigDecimal所創建的是對象,我們不能使用傳統的+、-、*、/等算術運算符直接對其對象進行數學運算,而必須調用其相對應的方法。方法中的參數也必須是BigDecimal的對象。
BigDecimal 由 【任意精度的整數非標度值】【32 位的整數標度 (scale)】組成。 如果為零或正數,則標度是小數點后的位數;如果為負數,則將該數的非標度值乘以 10 的負scale 次冪。因此,BigDecimal表示的數值是【unscaledValue * 10^-scale】。

JDK中對BigDecimal的定義為:不可變的、任意精度的有符號十進制數。
BigDecimal 類提供以下操作:算術、標度操作、舍入、比較、哈希算法和格式轉換。toString() 方法提供 BigDecimal 的規范表示形式。

注意,BigDecimal對象是不可變的(immutable)的(像String、BigInteger一樣),我們在調用其 加減乘除等方法后,其實最終都返回的是一個新的BigDecimal對象,所以在做每一步運算時一定要保存操作后的值。
BigDecimal bd = BigDecimal.valueOf(0.4);
BigDecimal bd2 = BigDecimal.valueOf(0.6);
bd.add(bd2);//雖然做了加法操作,但是bd並沒有保存加操作后的值
bd2 = bd.add(bd2);//bd2指向了一個新的BigDecimal對象的引用
System.out.println(bd.doubleValue() + "  " + bd2.doubleValue());//0.4  1.0
System.out.println(BigDecimal.valueOf(0.4).add(BigDecimal.valueOf(0.6)));//1.0。計算時一般都會鏈式調用

MathContext 類

public final class MathContext extends Object implements Serializable
該對象是封裝上下文設置的 不可變對象,它描述數字運算符的某些規則,例如由 BigDecimal 類實現的規則。
基本獨立設置為:
  • precision:某個操作使用的數字個數;結果舍入到此精度
  • roundingMode:一個 RoundingMode 對象,該對象指定舍入使用的算法。

構造方法
  • MathContext(int setPrecision)  構造一個新的 MathContext,它具有指定的精度和 HALF_UP 舍入模式。 參數setPrecision為非負 int 精度設置。
  • MathContext(int setPrecision, RoundingMode setRoundingMode)  構造一個新的 MathContext,它具有指定的精度和舍入模式。
  • MathContext(String val)  根據字符串構造一個新的 MathContext。該字符串的格式必須與 toString() 方法生成的字符串的格式相同。

靜態字段
  • static MathContext  DECIMAL128:一個 MathContext 對象,其精度設置與 IEEE 754R Decimal128 格式(即 34 個數字)匹配,舍入模式為 HALF_EVEN,這是 IEEE 754R 的默認舍入模式。
  • static MathContext  DECIMAL32 : 一個 MathContext 對象,其精度設置與 IEEE 754R Decimal32 格式(即 7 個數字)匹配,舍入模式為 HALF_EVEN,這是 IEEE 754R 的默認舍入模式。
  • static MathContext  DECIMAL64 : 一個 MathContext 對象,其精度設置與 IEEE 754R Decimal64 格式(即 16 個數字)匹配,舍入模式為 HALF_EVEN,這是 IEEE 754R 的默認舍入模式。
  • static MathContext  UNLIMITED : 其設置具有無限精度算法所需值的 MathContext 對象。該設置的值為: precision=0,roundingMode=HALF_UP
PS:默認的 HALF_EVEN模式不是"四舍五入"的模式,我們最好改為HALF_UP模式。

公共方法
  • int  getPrecision()  返回 precision 設置。此值始終為非負數。
  • RoundingMode  getRoundingMode()  返回 roundingMode 設置。它將是8種RoundingMode之一。
  • boolean  equals(Object x)  將此 MathContext 與指定的 Object 進行相等性比較。
  • int  hashCode()  返回此 MathContext 的哈希碼。
  • String  toString()  返回此 MathContext 的字符串表示形式。

構造方法

通過BigInteger構造BD

  • BigDecimal(BigInteger val)  將 BigInteger 轉換為 BigDecimal。
  • BigDecimal(BigInteger unscaledVal, int scale)  將 BigInteger 非標度值和 int 標度轉換為 BigDecimal。
【帶MathContext參數--根據上下文設置進行舍入
  • BigDecimal(BigInteger val, MathContext mc) 
  • BigDecimal(BigInteger unscaledVal, int scale, MathContext mc)

通過char[]構造BD

  • BigDecimal(char[] in)  將 BigDecimal 的字符數組表示形式轉換為 BigDecimal,接受與 BigDecimal(String) 構造方法相同的字符序列
  • BigDecimal(char[] in, int offset, int len)  將 BigDecimal 的字符數組表示形式轉換為 BigDecimal,接受與 BigDecimal(String) 構造方法相同的字符序列,同時允許指定子數組
【帶MathContext參數--根據上下文設置進行舍入】
  • BigDecimal(char[] in, MathContext mc)
  • BigDecimal(char[] in, int offset, int len, MathContext mc)

通過基本數據類型構造BD

  • BigDecimal(double val)  將 double 轉換為 BigDecimal,后者是 double 的二進制浮點值准確的十進制表示形式。
  • BigDecimal(int val)  將 int 轉換為 BigDecimal。
  • BigDecimal(long val)  將 long 轉換為 BigDecimal。
  • BigDecimal(String val)  將 BigDecimal 的字符串表示形式轉換為 BigDecimal。
public BigDecimal(String val) {
    this(val.toCharArray(), 0, val.length());
}
【帶MathContext參數--根據上下文設置進行舍入
  • BigDecimal(double val, MathContext mc)
  • BigDecimal(int val, MathContext mc)
  • BigDecimal(long val, MathContext mc)
  • BigDecimal(String val, MathContext mc)

構造方法使用推薦

1、不推薦使用含有double的構造方法
參數類型為double的構造方法的結果有一定的不可預知性。有人可能認為在Java中寫入new BigDecimal(0.1)所創建的BigDecimal正好等於 0.1(非標度值 1,其標度為 1,即 1*10^-1),但是它實際上等於***。這是因為0.1無法准確地表示為 double(或者說對於該情況,不能表示為任何有限長度的二進制小數)。這樣,傳入到構造方法的值不會正好等於 0.1(雖然表面上等於該值)。
String string=new BigDecimal(0.1).toEngineeringString();
System.out.println(string + "  " + string.length());//0.1000000000000000055511151231257827021181583404541015625  57
System.out.println(new BigDecimal(0.1).doubleValue() == 0.1);//true

System.out.println(new BigDecimal(1.22) + "  " + new BigDecimal("1.22"));//1.2199999999999999733546474089962430298328399658203125  1.22
System.out.println(new BigDecimal(1.22).doubleValue() == new BigDecimal("1.22").doubleValue());//true,並且都 == 1.22

2、當 double 必須用作 BigDecimal 的源時,可使用下面兩種方式之一:
  • 先使用 Double.toString 方法將 double 轉換為 String,然后使用含有 String 的構造方法。
    含有 String 的構造方法是完全可預知的:寫入 new BigDecimal("0.1") 將創建一個 BigDecimal,它正好等於預期的 0.1。因此,比較而言,通常建議優先使用含有 String 的構造方法
System.out.println(new BigDecimal("0.1") + "  " + new BigDecimal("0.1").toEngineeringString());//0.1  0.1
  • 也直接使用BigDecimal類中靜態的valueOf方法,這通常是將 double 和 float 轉換為一個 BigDecimal 的最好方式(第一種方式從本質上將也是采用的這種方式)
public static BigDecimal valueOf(double val) {
    return new BigDecimal(Double.toString(val));//第一種方式從本質上將也是采用的這種方式
}

靜態字段

三個實例
  • static BigDecimal  ONE  值為 1,標度為 0。
  • static BigDecimal  TEN  值為 10,標度為 0。
  • static BigDecimal  ZERO  值為 0,標度為 0。  

以下模式和RoundingMode中定義的模式是完全一致的,且JDK中建議使用RoundingMode中定義的模式。具體詳見另一篇筆記。
  1. static int  ROUND_CEILING(天花板; 最高限度)  接近正無窮大的舍入模式。
  2. static int  ROUND_DOWN  接近零的舍入模式。
  3. static int  ROUND_FLOOR  接近負無窮大的舍入模式。
  4. static int  ROUND_UP  舍入遠離零的舍入模式。
  5. static int  ROUND_UNNECESSARY  斷言請求的操作具有精確的結果,因此不需要舍入。
  6. static int  ROUND_HALF_DOWN  向“最接近的”數字舍入,如果與兩個相鄰數字的距離相等,則為上舍入的舍入模式。
  7. static int  ROUND_HALF_EVEN  向“最接近的”數字舍入,如果與兩個相鄰數字的距離相等,則向相鄰的偶數舍入。
  8. static int  ROUND_HALF_UP  向“最接近的”數字舍入,如果與兩個相鄰數字的距離相等,則為向上舍入的舍入模式。

公共方法

靜態方法:將基本類型轉換為BD

  • static BigDecimal  valueOf(double val)  返回值和 new BigDecimal(Double.toString(val)) 完全一致。
  • static BigDecimal  valueOf(long val)  將 long 值轉換為具有零標度的 BigDecimal。
  • static BigDecimal  valueOf(long unscaledVal, int scale)  將 long 非標度值和 int 標度轉換為 BigDecimal。

獲取標度、精度、正負號

【獲取標度、精度、正負號】
  • int  precision()  返回此 BigDecimal 的精度(精度是非標度值的數字【個數】)。零值的精度是 1。
  • int  scale()  返回此 BigDecimal 的標度。如果為零或正數,則標度是小數點后的位數。如果為負數,則將該數的非標度值乘以 10 的負 scale 次冪。例如, -3 標度是指非標度值乘以 1000。
  • int  signum()  返回此 BigDecimal 的正負號函數。當此 BigDecimal 的值為負、零或正時,返回 -1、0 或 1。
System.out.println(BigDecimal.valueOf(54).precision() + "  " + BigDecimal.valueOf(54).scale());//2  0    54=54*10^0
System.out.println(BigDecimal.valueOf(5).precision() + "  " + BigDecimal.valueOf(5).scale());//1  0    5=5*10^0
System.out.println(BigDecimal.valueOf(5.4).precision() + "  " + BigDecimal.valueOf(5.4).scale());//2  1    5.4=54*10^-1
System.out.println(BigDecimal.valueOf(0.054).precision() + "  " + BigDecimal.valueOf(0.054).scale());//2  3    0.054=54*10^-3
【設置標度】
  • BigDecimal  setScale(int newScale)  返回一個 BigDecimal,其標度為指定值,其值在數值上等於此 BigDecimal 的值。如果這不可能,則拋出 ArithmeticException。
  • BigDecimal  setScale(int newScale, int roundingMode)  返回一個 BigDecimal,其標度為指定值,其非標度值通過此 BigDecimal 的非標度值乘以或除以十的適當次冪來確定,以維護其總值。相對於此遺留方法,應優先使用新的 setScale(int, RoundingMode) 方法。
  • BigDecimal  setScale(int newScale, RoundingMode roundingMode)  返回 BigDecimal,其標度為指定值,其非標度值通過此 BigDecimal 的非標度值乘以或除以十的適當次冪來確定,以維護其總值。
BigDecimal bd = BigDecimal.valueOf(0.054);
System.out.println(bd.precision() + "  " + bd.scale() + "  " + bd.signum());//2  3  1    0.054=54*10^-3
BigDecimal bd2 = bd.setScale(4);
System.out.println(bd.precision() + "  " + bd.scale() + "  " + bd.signum());//2  3  1,還是那句話:BigDecimal是不可變的!
System.out.println(bd2.precision() + "  " + bd2.scale() + "  " + bd2.signum());//3  4  1    0.054=540*10^-4

加減乘除冪

  1. BigDecimal  add(BigDecimal augend)  返回一個 BigDecimal,其值為 (this + augend),其標度為 max(this.scale(), augend.scale())。
  2. BigDecimal  subtract(BigDecimal subtrahend)  返回一個 BigDecimal,其值為 (this - subtrahend),其標度為 max(this.scale(), subtrahend.scale())。
  3. BigDecimal  multiply(BigDecimal multiplicand)  返回一個 BigDecimal,其值為 (this * multiplicand),其標度為 (this.scale() + multiplicand.scale())。
  4. BigDecimal  divide(BigDecimal divisor)  返回一個 BigDecimal,其值為 (this / divisor),其首選標度為 (this.scale() - divisor.scale());如果無法表示准確的商值(因為它有無窮的十進制擴展),則拋出 ArithmeticException。
  5. BigDecimal  pow(int n)  返回其值為 (this^n) 的 BigDecimal,准確計算該冪,使其具有無限精度。參數 n 必須在 0 到 999999999(包括)之間。ZERO.pow(0) 返回 ONE。 注意,未來版本可能會擴展此方法允許的指數范圍。
  6. BigDecimal  scaleByPowerOfTen(int n)  返回其數值等於 (this * 10^n) 的 BigDecimal。該結果的標度為 (this.scale() - n)。
【帶MathContext參數 -- 根據上下文設置進行舍入
  1. BigDecimal  add(BigDecimal augend, MathContext mc)
  2. BigDecimal  subtract(BigDecimal subtrahend, MathContext mc)
  3. BigDecimal  multiply(BigDecimal multiplicand, MathContext mc)
  4. BigDecimal  divide(BigDecimal divisor, MathContext mc)  返回其值為 (this / divisor) 的 BigDecimal(根據上下文設置進行舍入)。
  5. BigDecimal  pow(int n, MathContext mc)  返回其值為 (thisn) 的 BigDecimal。
//測試加法 add
double addValue = BigDecimal.valueOf(0.05).add(BigDecimal.valueOf(0.01)).doubleValue();
System.out.println("0.05+0.01=" + (0.05 + 0.01) + "  " + addValue);//0.05+0.01=0.060000000000000005  0.06
//測試減法 subtract
double subtractValue = BigDecimal.valueOf(1.0).subtract(BigDecimal.valueOf(0.42)).doubleValue();
System.out.println("1.0-0.42=" + (1.0 - 0.42) + "  " + subtractValue);//1.0-0.42=0.5800000000000001  0.58
//測試乘法 multiply
double multiplyValue = BigDecimal.valueOf(4.015).multiply(BigDecimal.valueOf(100)).doubleValue();
System.out.println("4.015*100=" + (4.015 * 100) + "  " + multiplyValue);//4.015*100=401.49999999999994  401.5
//測試除法 divide
double divideValue = BigDecimal.valueOf(123.3).divide(BigDecimal.valueOf(100), 10, BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println("123.3/100=" + (123.3 / 100) + "  " + divideValue);//123.3/100=1.2329999999999999  1.233
//測試冪運算 pow、scaleByPowerOfTen
System.out.println(Math.pow(1.1, 2) + "  " + BigDecimal.valueOf(1.1).pow(2).doubleValue());//1.2100000000000002  1.21
System.out.println(BigDecimal.ONE.scaleByPowerOfTen(1024));//1E+1024
【除法擴展_為除法指定舍入模式】
  • BigDecimal  divide(BigDecimal divisor, int roundingMode)  返回一個 BigDecimal,其值為 (this / divisor),其標度為 this.scale()。如果必須執行舍入,以生成具有給定標度的結果,則應用指定的舍入模式。相對於此遺留方法,應優先使用新的 divide(BigDecimal, RoundingMode) 方法。
  • BigDecimal  divide(BigDecimal divisor, RoundingMode roundingMode)  返回一個 BigDecimal,其值為 (this / divisor),其標度為 this.scale()如果必須執行舍入,以生成具有給定標度的結果,則應用指定的舍入模式。
除法擴展_ 除法 指定標度和舍入模式
  • BigDecimal  divide(BigDecimal divisor, int scale, int roundingMode)  返回一個 BigDecimal,其值為 (this / divisor),其標度為指定標度。如果必須執行舍入,以生成具有指定標度的結果,則應用指定的舍入模式。相對於此遺留方法,應優先使用新的 divide(BigDecimal, int, RoundingMode) 方法。
  • BigDecimal  divide(BigDecimal divisor, int scale, RoundingMode roundingMode)  返回一個 BigDecimal,其值為 (this / divisor),其標度為指定標度。如果必須執行舍入,以生成具有指定標度的結果,則應用指定的舍入模式。

取余和取整

  • BigDecimal  divideToIntegralValue(BigDecimal divisor)  返回 BigDecimal,其值為向下舍入所得商值(this / divisor)的整數部分。該結果的首選標度為(this.scale() - divisor.scale())。
  • BigDecimal  remainder(BigDecimal divisor)  返回其值為 (this % divisor) 的 BigDecimal。余數由 this.subtract( this.divideToIntegralValue(divisor) .multiply(divisor) ) 給出。注意,這不是模操作(結果可以為負)。
  • BigDecimal[]  divideAndRemainder(BigDecimal divisor)  返回由兩個元素組成的 BigDecimal 數組,該數組包含 divideToIntegralValue 的結果,后跟對兩個操作數計算所得到的 remainder。注意,如果同時需要整數商和余數,則此方法比分別使用 divideToIntegralValue 和 remainder 方法更快速,因為相除僅需執行一次。
【帶MathContext參數
  • BigDecimal  remainder(BigDecimal divisor, MathContext mc)
  • BigDecimal  divideToIntegralValue(BigDecimal divisor, MathContext mc)
  • BigDecimal[]  divideAndRemainder(BigDecimal divisor, MathContext mc)
BigDecimal bd1 = BigDecimal.valueOf(5);
BigDecimal bd2 = BigDecimal.valueOf(2);

BigDecimal bd_div = bd1.divide(bd2);//商
BigDecimal bd_dti = bd1.divideToIntegralValue(bd2);//向下舍入所得商值(this / divisor)的整數部分
BigDecimal bd_tem = bd1.subtract(bd1.divideToIntegralValue(bd2).multiply(bd2));//remainder計算的過程
BigDecimal bd_rem = bd1.remainder(bd2);//返回其值為 (this % divisor) 的 BigDecimal。注意,這不是模操作(結果可以為負)
System.out.println(bd_div + "  " + bd_dti + "  " + bd_tem + "  " + bd_rem + "  " + bd_tem.equals(bd_rem));//2.5  2  1  1  true

BigDecimal[] array = bd1.divideAndRemainder(bd2);
System.out.println(Arrays.toString(array) + "  " + array[0].equals(bd_dti) + "  " + array[1].equals(bd_rem));//[2, 1]  true  true

絕對值、正負值

  • BigDecimal  abs()  返回 BigDecimal,其值為此 BigDecimal 的絕對值,其標度為 this.scale()。
  • BigDecimal  negate()  返回 BigDecimal,其值為 (-this),其標度為 this.scale()。
  • BigDecimal  plus()  返回 BigDecimal,其值為 (+this),其標度為 this.scale()。此方法僅返回此 BigDecimal,該方法與一元減方法 negate() 對稱
【帶MathContext參數
  • BigDecimal  abs(MathContext mc)  返回其值為此 BigDecimal 絕對值的 BigDecimal(根據上下文設置進行舍入)。
  • BigDecimal  negate(MathContext mc)  返回其值為 (-this) 的 BigDecimal(根據上下文設置進行舍入)。
  • BigDecimal  plus(MathContext mc)  返回其值為 (+this) 的 BigDecimal(根據上下文設置進行舍入)。此方法的效果與 round(MathContext) 方法的效果相同。

其他返回BigDecimal的方法

【最大最小值】
  • BigDecimal  max(BigDecimal val)  返回此 BigDecimal 和 val 的最大值。根據 compareTo 方法的定義,如果它們相等,則返回 this。
  • BigDecimal  min(BigDecimal val)  返回此 BigDecimal 和 val 的最小值。根據 compareTo 方法的定義,如果它們相等,則返回 this。
【移動小數點】
  • BigDecimal  movePointLeft(int n)  返回一個 BigDecimal,它等效於將該值的小數點向左移動 n 位。如果 n 為非負數,則調用僅將 n 添加到該標度。如果 n 為負數,則該調用等效於 movePointRight(-n)。此調用返回的 BigDecimal 的值為 (this * 10^-n),標度為 max(this.scale()+n, 0)。
  • BigDecimal  movePointRight(int n)  返回一個 BigDecimal,它等效於將該值的小數點向右移動 n 位。如果 n 為非負數,則該調用僅從該標度減去 n。如果 n 為負,則該調用等效於 movePointLeft(-n)。此調用返回的 BigDecimal 的值為 (this * 10^n),標度為 max(this.scale()-n, 0)。
【其他方法】
  • BigDecimal  stripTrailingZeros()  返回數值上等於此小數,但從該表示形式移除所有尾部零的 BigDecimal。
  • BigDecimal  ulp()  返回此 BigDecimal 的 ulp(最后一位的單位)的大小。
  • BigDecimal  round(MathContext mc)  返回根據 MathContext 設置進行舍入后的 BigDecimal。如果精度設置為 0,則不進行任何舍入操作。此方法的效果與 plus(MathContext) 方法的效果相同。

轉換為基本數據類型

【基本收縮轉換】
  1. int  intValue()  將此 BigDecimal 轉換為 int。此轉換類似於 Java Language Specification 中定義的從 double 到 short 的 基本收縮轉換:將丟棄此 BigDecimal 的所有小數部分,並且如果生成的 " BigInteger" 太大而不適合用 int 表示,則僅返回 32 位低位字節。注意,此轉換會丟失關於此 BigDecimal 值的總大小和精度的信息,並返回帶有相反符號的結果。
  2. long  longValue()  將此 BigDecimal 轉換為 long。此轉換類似於 Java Language Specification 中定義的從 double 到 short 的 基本收縮轉換:將丟棄此 BigDecimal 的小數部分,並且如果生成的 " BigInteger" 太大而不適合用 long 表示,則僅返回 64 位低位字節。注意,此轉換會丟失關於此 BigDecimal 值的總大小和精度的信息,並返回帶有相反符號的結果。
  3. float  floatValue()  將此 BigDecimal 轉換為 float。此轉換類似於 Java Language Specification 中定義的從 double 到 float 的 基本收縮轉換:如此 BigDecimal 的值太大而不能表示為 float,則將其適當地轉換為 Float.NEGATIVE_INFINITY 或 Float.POSITIVE_INFINITY。注意,即使在返回值為有限值的情況下,此轉換也可能丟失關於 BigDecimal 值精度的信息。
  4. double  doubleValue()  將此 BigDecimal 轉換為 double。此轉換類似於 Java Language Specification 中定義的從 double 到 float 的 基本收縮轉換:如果此 BigDecimal 的數量太大而不能表示為 double,則將其適當地轉換為 Double.NEGATIVE_INFINITY 或 Double.POSITIVE_INFINITY。注意,即使在返回值為有限值的情況下,此轉換也可能丟失關於 BigDecimal 值精度的信息。
【轉換為基本數據類型】
  1. byte  byteValueExact()  將此 BigDecimal 轉換為 byte,以檢查丟失的信息。如果此 BigDecimal 具有非零小數部分,或者超出 byte 結果的可能范圍,則拋出 ArithmeticException。
  2. short  shortValueExact()  將此 BigDecimal 轉換為 short,以檢查丟失的信息。如果此 BigDecimal 具有非零小數部分,或者超出 short 結果的可能范圍,則拋出 ArithmeticException。
  3. int  intValueExact()  將此 BigDecimal 轉換為 int,以檢查丟失的信息。如果此 BigDecimal 具有非零小數部分,或者超出 int 結果的可能范圍,則拋出 ArithmeticException。
  4. long  longValueExact()  將此 BigDecimal 轉換為 long,以檢查丟失的信息。如果此 BigDecimal 具有非零小數部分,或者超出 long 結果的可能范圍,則拋出 ArithmeticException。
BigDecimal bd = BigDecimal.ONE.scaleByPowerOfTen(18);
System.out.println(Long.MAX_VALUE + "  " + (Long.MAX_VALUE + "").length());//9223372036854775807  19
System.out.println(bd.longValue() + "  " + bd.longValueExact() + "  " + (bd.longValue() + "").length());//1000000000000000000  1000000000000000000  19
BigDecimal bd2 = BigDecimal.ONE.scaleByPowerOfTen(19);
System.out.println(bd2 + "  " + bd2.longValue()+ "  " + bd2.doubleValue());//1E+19  -8446744073709551616  1.0E19
try {
	System.out.println(bd2.longValueExact());
} catch (Exception e) {
	e.printStackTrace();
	System.out.println("如果此 BigDecimal 具有非零小數部分,或者超出 long 結果的可能范圍,則拋出 ArithmeticException");
}

字符串表示形式

  • String  toString()  返回此 BigDecimal 的字符串表示形式,如果需要指數,則使用【科學記數法】
  • String  toEngineeringString()  返回此 BigDecimal 的字符串表示形式,需要指數時,則使用【工程計數法】
    • 返回如 toString() 方法中所描述的表示 BigDecimal 的字符串,不包括使用指數記數法的情況,將十的冪調整為三的倍數(工程記數法),這樣,非零值的整數部分的范圍是 1 到 999。如果對零值使用指數記數法,則使用小數點和小數的一(或二)個零數字,以便保留零值的標度。
  • String  toPlainString()  返回【不帶指數字段】的此 BigDecimal 的字符串表示形式。

轉換為BigInteger

  • BigInteger  toBigInteger()  將此 BigDecimal 轉換為 BigInteger。
  • BigInteger  toBigIntegerExact()  將此 BigDecimal 轉換為 BigInteger,以檢查丟失的信息。
  • BigInteger  unscaledValue()  返回其值為此 BigDecimal 的非標度值 的 BigInteger。計算 (this * 10^this.scale())。

重載自Object的方法

  • int  compareTo(BigDecimal val)  將此 BigDecimal 與指定的 BigDecimal 比較。
  • int  hashCode()  返回此 BigDecimal 的哈希碼。
  • boolean  equals(Object x)  比較此 BigDecimal 與指定的 Object 的相等性。
2017-8-26





免責聲明!

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



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