BigDecimal使用注意的地方

fengdong發表於2024-09-04

BigDecimal 是 Java 中的一個類,這個相信大家都是知道的。它的作用就是可以表示任意精度的十進位制數,BigDecimal 提供了精確的數字運算,適用於需要高精度計算的場景。

一、浮點精度

我們先來看一個例子:

compareTo 方法比較中,a.compareTo(b)

返回:

  • -1: a小於b

  • 0: a等於b

  • 1: a大於b。

在上方的程式碼中,我們使用 new BigDecimal 的形式 new 了兩個 BigDecimal 物件,分別是 0.10.10

我們分別使用了 equalscompareTo 進行比較,當使用 equals 進行比較時,返回了 false,這是因為 equals 不僅比較了值是否相等,還比較了精度是否相等。

簡單概括一下,如果比較兩個 BigDecimal 物件的大小,那就使用 compareTo 方法;如果嚴格比較精度的大小,那就使用 equals 方法進行比較。

二、設定精度

在做 BigDecimal 物件計算的時候,一定要設定精度。

在做 divide 運算時,如果商是一個無限小數,而操作的結果是一個精確的數字,那麼就會丟擲該異常。

三、初始化

先來看程式碼:

在使用 new BigDecimal 構造器進行初始化的時候,如果有初始值,最好使用字串的構造方法進行初始化。

在使用 double 的構造器進行新建時,本身傳入的 0.1 就是浮點型別了,為了不丟失精度,在使用 new BigDecimal 新建時就把這個近似值完整的保留下來了。

或者就是 另外一種初始化方式 BigDecimal.valueOf(0.1);,透過看原始碼可以發現,在 valueOf 的內部,將 Double 型別直接轉為了字串了,因此也就不會存在精度丟失的問題了。

四、轉字串

還是先看一段程式碼:

上面程式碼中是一個非常大的數,我想把他轉為字串,可是在使用 toString() 方法時,列印出來的卻是科學計數法。

所以如果想使用 toString() 方法進行轉字串時,可以使用設定精度的方法,但是結果還是與我們的預期有所差別,我們想要的是一模一樣的列印出來呢?

那麼 toPlainString 就上場了,這個方法返回一個字串的表示形式,包含所有的有效數字。

程式碼修改如下:

所以總結就是
  • toString:返回有效數字,必要的時候使用科學計數法。
  • toPlainString: 不實用任何科學計數法。
  • toEngineeringString:必要的時候使用工程計數法。

相關文章