new BigDecimal時,請使用字串作為引數為最佳,避免不必要的麻煩

HD243608836發表於2018-05-06


一、構造BigDecimal

BigDecimal提供了豐富的建構函式,可以通過int、long、double、String等來構造一個BigDecimal物件。

但是,使用double作為引數的建構函式,無法精確構造一個BigDecimal物件,需要自己指定一個上下文的環境,也就是指定精確位。 
例如:

BigDecimal bg = new BigDecimal(1.1);
System.out.println(bg.toString());

執行結果:
1.100000000000000088817841970012523233890533447265625

所以,通常情況下,我們會使用String物件作為引數來構造一個精確的BigDecimal物件。 
下面提供的三種方法都是可以的:

//方法一
BigDecimal bg1 = new BigDecimal("1.1");
//方法二
BigDecimal bg2 = new BigDecimal(Double.toString(1.1));
//方法三
BigDecimal bg3 = BigDecimal.valueOf(1.1);

System.out.println(bg1.toString());
System.out.println(bg2.toString());
System.out.println(bg3.toString());

執行結果:
1.1
1.1
1.1

附: 
BigDecimal.value(double val)方法為什麼可以呢? 
看看下面的原始碼,大家應該就清楚了:

public static BigDecimal valueOf(double val) {
  return new BigDecimal(Double.toString(val));
 }

二、生產中遇到的問題

1、資料庫出現型別轉換錯誤 
回想起來,情景歷歷在目,資料庫中定義的是decimal型別,模型定義的是BigDecial,照理來說肯定不會錯,但是,神奇的事情發生,在更新decimal型別的欄位時,竟然出現了varchar轉化為decimal的型別轉換錯誤。 
排查了好久,最後發現是建立BigDecimal時,使用的是BigDecimal(float)這個建構函式,快取String型別的建構函式就沒問題了。

2、頁面顯示無限小數 

這個跟上面那個類似,也是在建立BigDecimal物件時,使用的是float型別的引數,導致頁面上顯示的是無限小數,換成String型別的建構函式就可以了。


轉載自:https://blog.csdn.net/u011983531/article/details/67637757

相關文章