天天看點

string怎麼轉成bigdecimal_Java.math.BigDecimal類的使用1.引言2.BigDecimal構造方法3.BigDecimal的靜态方法valueOf4.BigDecimal加減乘除運算

1.引言

浮點數值不适用于無法接受舍入誤差的金融計算中。

例如,指令System.out.prmtln (2.0-1.1)将列印出0.8999999999999999,而不是人們想象的0.9 。

string怎麼轉成bigdecimal_Java.math.BigDecimal類的使用1.引言2.BigDecimal構造方法3.BigDecimal的靜态方法valueOf4.BigDecimal加減乘除運算

2.0-1.1的運算結果

這種舍入誤差的主要原因是浮點數值采用二進制系統表示,而在二進制系統中 無法精确地表示分數1/10。這就好像十進制無法精确地表示分數1/3一樣。如果在數值 計算中不允許有任何舍入誤差,就應該使用BigDecimaI類

2.BigDecimal構造方法

  1. BigDecimal(double val) 将double表示形式轉換為BigDecimal *不建議使用
  2. BigDecimal(int val) 将int表示形式轉換成BigDecimal
  3. BigDecimal(String val) 将String表示形式轉換成BigDecimal
string怎麼轉成bigdecimal_Java.math.BigDecimal類的使用1.引言2.BigDecimal構造方法3.BigDecimal的靜态方法valueOf4.BigDecimal加減乘除運算

JDK1.8 API幫助文檔

  • 為什麼不建議采用第一種構造方法呢?來看例子
string怎麼轉成bigdecimal_Java.math.BigDecimal類的使用1.引言2.BigDecimal構造方法3.BigDecimal的靜态方法valueOf4.BigDecimal加減乘除運算

為什麼bDouble不等于2.3?

  • 為什麼會出現這種情況呢?

JDK的描述:1、參數類型為double的構造方法的結果有一定的不可預知性。這是因為0.1無法準确地表示為 double,實際上等于0.1000000000000000055511151231257827021181583404541015625。

2、另一方面,String 構造方法是完全可預知的:寫入 newBigDecimal("0.1") 将建立一個 BigDecimal,它正好等于預期的 0.1。是以,比較而言,通常建議優先使用String構造方法。

3.BigDecimal的靜态方法valueOf

當double必須用作BigDecimal的源時,可以使用BigDecimal的靜态方法valueOf

如果使用Double.toString(double)轉成String,然後再使用BigDecimal構造方法,*這樣會很複雜,如下

string怎麼轉成bigdecimal_Java.math.BigDecimal類的使用1.引言2.BigDecimal構造方法3.BigDecimal的靜态方法valueOf4.BigDecimal加減乘除運算

4.BigDecimal加減乘除運算

對于常用的加,減,乘,除,BigDecimal類提供了相應的成員方法

string怎麼轉成bigdecimal_Java.math.BigDecimal類的使用1.引言2.BigDecimal構造方法3.BigDecimal的靜态方法valueOf4.BigDecimal加減乘除運算

API文檔給出的BigDecimal類相應的成員方法

大緻的用法如下

string怎麼轉成bigdecimal_Java.math.BigDecimal類的使用1.引言2.BigDecimal構造方法3.BigDecimal的靜态方法valueOf4.BigDecimal加減乘除運算