BigDecimal
是 Java 中的一個類,這個相信大家都是知道的。它的作用就是可以表示任意精度的十進位制數,BigDecimal
提供了精確的數字運算,適用於需要高精度計算的場景。
一、浮點精度
我們先來看一個例子:
compareTo 方法比較中,a.compareTo(b)
返回:
-
-1: a小於b
-
0: a等於b
-
1: a大於b。
在上方的程式碼中,我們使用 new BigDecimal
的形式 new 了兩個 BigDecimal
物件,分別是 0.1
和0.10
。
我們分別使用了 equals
與 compareTo
進行比較,當使用 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
:必要的時候使用工程計數法。