天天看點

解決BigDecimal工作中遇到的坑工作中遇到的問題

BigDecimal精度遇到的坑

  • 工作中遇到的問題
    • BigDecimal失精的原因
    • 解決辦法

工作中遇到的問題

作為一個新手,記得在第一次使用同僚推薦的BigDecimal這個包裝類的時候,遇到了很多問題,開始在使用BigDecimal的時候,用的是轉double然後做運算,結果最後失精了,這是小編一開始用的時候遇到的一個很愚蠢的問題 .希望大家不要嘲笑,後來慢慢的測試和檢視資料發現,BigDecimal的運算方法是不會失精的 ,大家工作的時候可以使用BigDecimal進行運算

BigDecimal失精的原因

  1. BigDecimal隻有在初始化的時候使用double初始化,可能會導緻失精,
  2. 轉成double進行計算
  3. 轉成double顯示有時候也會出現失精,原因是double不适合表示小時

解決辦法

大家使用的時候可以使用BigDecimal.valueOf()方法,或者使用new BigDecimal(“0.1”);

public static BigDecimal valueOf(double val) {
		//檢視了BigDecimal源碼才知道,這貨為了精度不丢失,使用的是String初始化了一個新的對象傳回的.
        // Reminder: a zero double returns '0.0', so we cannot fastpath
        // to use the constant ZERO.  This might be important enough to
        // justify a factory approach, a cache, or a few private
        // constants, later.
        return new BigDecimal(Double.toString(val));
    }
           

是以小編推薦大家在使用的時候可以使用new BigDecimal(“0.1”);初始化,或者使用BigDecimal.valueOf(0.1);都可以.

不能使用double和float. 因為double和float不是表示小數的.

官方解釋:float和double類型主要是為了科學計算和工程計算而設計,他們執行二進制浮點運算,這是為了在廣泛的數值範圍上提供較為精确的快速近和計算而精心設計的,然而,他們并沒有提供完全精确的結果,是以不應該被用于精确的結果的場合

老版本項目疊代下來的,隻能在做顯示的時候轉BigDecimal,在計算的時候使用BigDecimal的方法進行計算.

注:小編也是總結自己在學習BigDecimal的時候遇到問題,和總計,可能會有很多不足的地方希望有大神能指出,感激不盡.小編會繼續深入了解BigDecimal 和精度的學習 .後期可能會繼續更新這方面的内容.