BigDecimal如何使用?

2021-03-02 IT特靠譜
平凡也就兩個字: 懶和惰;
成功也就兩個字: 苦和勤;
優秀也就兩個字: 你和我。
跟著我從0學習JAVA、spring全家桶和linux運維等知識,帶你從懵懂少年走向人生巔峰,迎娶白富美!
每一篇文章都是心得總結,跟我學習你就是大牛!BigDecimal如何使用?1 BigDecimal簡述

      BigDecimal類是java.math包提供的用於準確計算的API類,用來對超過16位有效位的數進行精確的運算。雖然雙精度浮點型變量double可以處理16位有效數,但在實際應用中可能需要對更大或者更小的數進行運算和處理。一般情況下,對於那些不需要準確計算精度的數字我們可以直接使用Float或Double處理,但是Double.valueOf(String) 和Float.valueOf(String)會丟失精度。如果我們需要精確計算的結果,則必須使用BigDecimal類來操作。

      BigDecimal所創建的是對象,因此我們不能使用+、-、*、/等算術運算符來實現加減乘除算數運算,而應當調用BigDecimal類對象的add、subtract、multiply或divide方法來進行算數運算!下面我們一起來嘗試下。

2 BigDecimal算數運算
        log.info("a + b={}", new BigDecimal("5.5").add(new BigDecimal("4.1")));    log.info("a - b={}", new BigDecimal("10.6").subtract(new BigDecimal("3.8")));    log.info("a * b={}", new BigDecimal("12.1").multiply(new BigDecimal("0.13")));
log.info("a ÷ b={}", new BigDecimal("12.1").divide(new BigDecimal("3.2"), 2, BigDecimal.ROUND_DOWN));


3 Rounding mode(捨入模式)

      Rounding mode是Bigdecimal類對象捨入模式。其提供了8種捨入模式,使用時按需選擇即可!開發者常常不清楚各種捨入模式的作用或區別,博主就給大家詳細講解下!

3.1 RoundingMode.DOWN

      粗暴截斷捨棄多餘位(捨去小數第3位及其後面小數),不考慮任何進位舍位操作。等價於BigDecimal.ROUND_DOWN。

      1.331 ---> 1.33

      1.2199 ---> 1.21

      1.308 ---> 1.30

    log.info("RoundingMode.DOWN={}", new BigDecimal("1.331").setScale(2, RoundingMode.DOWN));    log.info("RoundingMode.DOWN={}", new BigDecimal("1.2199").setScale(2, RoundingMode.DOWN));    log.info("RoundingMode.DOWN={}", new BigDecimal("1.308").setScale(2, RoundingMode.DOWN));


3.2 RoundingMode.UP

      小數第3位粗暴進位,朝遠離數軸的方向進位。正數+1,負數-1。等價於BigDecimal.ROUND_UP。

      3.3333 ---> 3.34

      1.7397 ---> 1.74

      -2.8699 ---> -2.87

      -2.1096 ---> -2.11

    log.info("RoundingMode.UP={}", new BigDecimal("3.3333").setScale(2, RoundingMode.UP));    log.info("RoundingMode.UP={}", new BigDecimal("1.7397").setScale(2, RoundingMode.UP));    log.info("RoundingMode.UP={}", new BigDecimal("-2.8699").setScale(2, RoundingMode.UP));    log.info("RoundingMode.UP={}", new BigDecimal("-2.1096").setScale(2, RoundingMode.UP));

3.3 RoundingMode.CEILING

      精度保留的最後一位,朝數軸正方向round。正數時等價於UP,負數時等價於DOWN。等價於BigDecimal.ROUND_CEILING

      3.2333 ---> 3.24

      1.7777 ---> 1.78

      -4.5689 ---> -4.56 

      -1.1076 ---> -1.10

    log.info("RoundingMode.CEILING={}", new BigDecimal("3.2333").setScale(2, RoundingMode.CEILING));    log.info("RoundingMode.CEILING={}", new BigDecimal("1.7777").setScale(2, RoundingMode.CEILING));    log.info("RoundingMode.CEILING={}", new BigDecimal("-4.5689").setScale(2, RoundingMode.CEILING));    log.info("RoundingMode.CEILING={}", new BigDecimal("-1.1076").setScale(2, RoundingMode.CEILING));

3.4 RoundingMode.FLOOR

      與CEILING 相反,在精度最後一位,朝數軸負方向round。正數時等價於DOWN,負數時等價於UP。等價於BigDecimal.ROUND_FLOOR。 

      3.2333 ---> 3.23

      1.7777 ---> 1.77 

      -4.5689 ---> -4.57

      -1.1076 ---> -1.11

      -1.1016 ---> -1.11

    log.info("RoundingMode.FLOOR={}", new BigDecimal("3.2333").setScale(2, RoundingMode.FLOOR));    log.info("RoundingMode.FLOOR={}", new BigDecimal("1.7777").setScale(2, RoundingMode.FLOOR));    log.info("RoundingMode.FLOOR={}", new BigDecimal("-4.5689").setScale(2, RoundingMode.FLOOR));    log.info("RoundingMode.FLOOR={}", new BigDecimal("-1.1076").setScale(2, RoundingMode.FLOOR));    log.info("RoundingMode.FLOOR={}", new BigDecimal("-1.1016").setScale(2, RoundingMode.FLOOR));

3.5 RoundingMode.HALF_UP

      四捨五入。等價於BigDecimal.ROUND_HALF_UP。

      1.331 ---> 1.33

      1.2199 ---> 1.22

      -4.5689 ---> -4.57

      -1.1076 ---> -1.11

      -1.1016 ---> -1.10

      -2.555 ---> -2.56

    log.info("RoundingMode.HALF_UP={}", new BigDecimal("1.331").setScale(2, RoundingMode.HALF_UP));    log.info("RoundingMode.HALF_UP={}", new BigDecimal("1.2199").setScale(2, RoundingMode.HALF_UP));    log.info("RoundingMode.HALF_UP={}", new BigDecimal("-4.5689").setScale(2, RoundingMode.HALF_UP));    log.info("RoundingMode.HALF_UP={}", new BigDecimal("-1.1076").setScale(2, RoundingMode.HALF_UP));    log.info("RoundingMode.HALF_UP={}", new BigDecimal("-1.1016").setScale(2, RoundingMode.HALF_UP));    log.info("RoundingMode.HALF_UP={}", new BigDecimal("-2.555").setScale(2, RoundingMode.HALF_UP));

3.6 RoundingMode.HALF_DOWN

      五舍六入。等價於BigDecimal.ROUND_HALF_DOWN。

      1.331 ---> 1.33

      1.2199 ---> 1.22

      2.555 ---> 2.55

      2.556 ---> 2.56

      -4.5689 ---> -4.57

      -1.1076 ---> -1.11

      -1.1016 ---> -1.10

      -2.555 ---> -2.55

      -2.556 ---> -2.56

    log.info("RoundingMode.HALF_DOWN={}", new BigDecimal("1.331").setScale(2, RoundingMode.HALF_DOWN));    log.info("RoundingMode.HALF_DOWN={}", new BigDecimal("1.2199").setScale(2, RoundingMode.HALF_DOWN));    log.info("RoundingMode.HALF_DOWN={}", new BigDecimal("2.555").setScale(2, RoundingMode.HALF_DOWN));    log.info("RoundingMode.HALF_DOWN={}", new BigDecimal("2.556").setScale(2, RoundingMode.HALF_DOWN));    log.info("RoundingMode.HALF_DOWN={}", new BigDecimal("-4.5689").setScale(2, RoundingMode.HALF_DOWN));    log.info("RoundingMode.HALF_DOWN={}", new BigDecimal("-1.1076").setScale(2, RoundingMode.HALF_DOWN));    log.info("RoundingMode.HALF_DOWN={}", new BigDecimal("-1.1016").setScale(2, RoundingMode.HALF_DOWN));    log.info("RoundingMode.HALF_DOWN={}", new BigDecimal("-2.555").setScale(2, RoundingMode.HALF_DOWN));    log.info("RoundingMode.HALF_DOWN={}", new BigDecimal("-2.556").setScale(2, RoundingMode.HALF_DOWN));

3.7 RoundingMode.HALF_EVEN

      當捨入位非5時,四捨六入。當捨入位為5時,看捨入位前一位,即保留的最後一位,當其為奇數時進位,否則舍位。等價於 BigDecimal.ROUND_HALF_EVEN。

      -2.555 ---> -2.56

      -2.545 ---> -2.54

      2.555 ---> 2.56

      2.545 ---> 2.54

    log.info("RoundingMode.HALF_EVEN={}", new BigDecimal("-2.555").setScale(2, RoundingMode.HALF_EVEN));    log.info("RoundingMode.HALF_EVEN={}", new BigDecimal("-2.545").setScale(2, RoundingMode.HALF_EVEN));    log.info("RoundingMode.HALF_EVEN={}", new BigDecimal("2.555").setScale(2, RoundingMode.HALF_EVEN));    log.info("RoundingMode.HALF_EVEN={}", new BigDecimal("2.545").setScale(2, RoundingMode.HALF_EVEN));

3.8 RoundingMode.UNNECESSARY

      認為傳入的數據一定滿足設置的小數模式,如果不滿足,則拋出ArithmeticException異常。等價於BigDecimal.ROUND_UNNECESSARY。

      2.54 ---> 2.54

      2.540 ---> 2.54

      2.541 ---> 拋ArithmeticException異常

    log.info("RoundingMode.UNNECESSARY={}", new BigDecimal("2.54").setScale(2, RoundingMode.UNNECESSARY));    log.info("RoundingMode.UNNECESSARY={}", new BigDecimal("2.540").setScale(2, RoundingMode.UNNECESSARY));    log.info("RoundingMode.UNNECESSARY={}", new BigDecimal("2.541").setScale(2, RoundingMode.UNNECESSARY));

4 常見示例4.1 捨去小數取整
    public static String getIntegerStr(){    BigDecimal big = new BigDecimal("0.245");    return big.setScale(0, BigDecimal.ROUND_DOWN).toString();  }


      如果你有疑問或需要技術支持,關注公眾號聯繫我吧~

相關焦點

  • 使用BigDecimal實現精確加減乘除運算
    在前幾期的每日一練題目中,有一道題目是,需要精確計算的時候一定要使用BigDecimal。在本科時候其實計算機原理就曾經學過計算機的浮點數表示,但是從小數學的慣性思維上,總覺得乘法就移一下小數點,不會出問題。在商業計算中遇到帶小數點的「元」轉換為「分」的時候,進行*100的操作總覺得double根本不會出問題,於是怒踩了一坑。
  • 為什麼阿里巴巴禁止使用BigDecimal的equals方法做等值比較?
    很多人都知道,在進行金額表示、金額計算等場景,不能使用double、float等類型,而是要使用對精度支持的更好的BigDecimal。 所以,很多支付、電商、金融等業務中,BigDecimal的使用非常頻繁。而且不得不說這是一個非常好用的類,其內部自帶了很多方法,如加,減,乘,除等運算方法都是可以直接調用的。
  • Java如何格式化輸出BigDecimal
    前面我就寫過一篇《Java中使用BigDecimal需要注意的兩點》與BigDecimal相關的內容,有興趣的朋友可以翻閱一下。有的時候我們需要對BigDecimal的內容進行一些格式化的輸出,比如要對表示人民幣金額的BigDecimal對象保留兩位小數,並增加「¥」前綴輸出。這要怎麼處理呢,自己寫一套邏輯進行處理拼接字符串?
  • 新手注意:Java中使用BigDecimal類時要避免的坑
    Java中使用BigDecimal類時要避免的坑除了NG行,其他行的輸出結果依次為:43.343.333.343.333.333.332.50總結:果兩數相除,除不盡時,需要指定保留精度和進位方式Java中使用BigDecimal類時要避免的坑總結:若要嚴格含精度對比是否相等需要用equals方法,若只是比較數值的大小忽略精度用compareTo方法。
  • Java中的數學運算BigDecimal
    ; // 401.49999999999994        System.out.println("123.3 / 100 = " + (123.3 / 100)); // 1.2329999999999999        // BigDecimal解決精度問題        BigDecimal f1 = new BigDecimal("0.05"); // 使用
  • 如何正確使用料理機
    導讀 許多朋友在買了料理機之後不知道如何使用,更不知道如何正確使用料理機。的確,對於料理機的使用雖然簡單,但也有許多使用事項在裡面。下面我們就來說說如何正確使用料理機。
  • 好程式設計師Java培訓分享BigDecimal的用法
    好程式設計師Java培訓分享BigDecimal的用法,如果對數值結果精度要求很高,那麼就可以使用BigDecimal,BigDecimal可以精準的控制小數點後面的數字
  • 烤箱如何使用 烤箱正確使用方法
    烤箱如何使用 烤箱正確使用方法時間:2020-12-18 00:17   來源:今日頭條   責任編輯:毛青青 川北在線核心提示:原標題:烤箱如何使用 烤箱正確使用方法 1、第一次使用電烤箱的時候要注意先用乾淨溼布將烤箱內外擦拭一遍,除去一些塵埃。
  • 攻城掠地銀幣如何使用 銀幣使用心得
    攻城掠地是一款國戰策略型手機遊戲,在這款遊戲中玩家需要使用到各種資源,其中銀幣是非常重要的,不過很多玩家到了100級之後就認為銀幣不需要了,其實不然,到這個時候玩家合理的使用銀幣能夠幫助自己更好的發展,那麼攻城掠地銀幣如何使用呢?今天小編就給玩家們帶來了銀幣使用心得。
  • 如何使用無線跳蛋?
    如何使用無線跳蛋,是很多人都想知道的問題。
  • 吸塵器如何正確使用?規範使用才能有效延長使用壽命!
    但是使用時間長了之後也會出現不好用的情況,那麼如何正確使用吸塵器呢?接下來就介紹下吸塵器的正確使用方法,可以有效延長使用壽命。1、使用吸塵器時,請注意要裝好濾塵袋,檢查機體上的集層過濾袋,框格是否放平放妥,機體上應該關緊的門、搭扣或蓋是否關好、蓋嚴和搭緊,檢查確認無誤後才可啟用,以免灰塵進入電機室。不要使吸入口堵塞,否則會引起電機過載,損傷電機。
  • 如何正確使用酒麴
    我是甘木棉,本節內容為大家講解酒麴如何正確使用,文章收錄在《釀酒必備的酒麴如何製作?》專欄中,如需了解更多酒麴製作的內容可以點擊文後連結進入專欄裡的其它章節了解,關注我還會有更多的美酒美食相關知識分享,期待您的支持!
  • 如何正確使用防曬霜?
    如何正確使用防曬霜? 夏季裡,陽光猛紫外線強,分分鐘能讓你這個夏天「沒有白過」,我們該如何正確使用防曬用品呢
  • 破壁機如何進行使用?
    然而並不是所有人都能夠掌握破壁機的正確使用方式,很多人僅僅用它來製作豆漿或者是果汁,那麼這種機器應該如何進行使用呢?如何打豆漿?因為這種機器能夠和豆漿機一樣打出非常美味細膩的豆漿。將豆漿和水放入在容器當中。
  • 馬桶如何使用 使用馬桶要注意什麼
    馬桶大家都知道的吧,是衛浴產品中很重要的一種,在使用馬桶的時候需要知道馬桶如何使用這個問題,因為正確的使用馬桶方法可以提高馬桶的使用年限,而且也可以減少很多問題的發生。那麼使用馬桶要注意什麼,來看看相關的內容和介紹吧,對於馬桶等相關的問題都可以有很好的參考。
  • 面試官:BigDecimal一定不會丟失精度嗎?
    而使用BigDecimal的背後又有什麼值得去探究的地方嗎?今天,告訴你,知其然,也知其所以然。BigDecimal精度也丟失我們在使用BigDecimal時,使用它的BigDecimal(String)構造器創建對象才有意義。其他的如BigDecimal b = new BigDecimal(1)這種,還是會發生精度丟失的問題。
  • 微信編輯器如何使用?
    最實用的微信編輯器使用全解介紹給大家,簡單實用一、頁面介紹操作界面中,主要包括分類區,樣式展示區,內容編輯區三個部分。(1) 在分類區可根據需要選擇樣式類別(2) 在頁面的「樣式展示區」選擇所需的素材(3) 在樣式展示區選擇素材後可複製到內容編輯區進行修改1.調色盤2.背景切換3、論壇4、提交樣式5、用戶交流群6.常用功能二、如何使用樣式在編輯器裡,樣式顯示在樣式展示區,點擊某個樣式,可以直接將該樣式插入到編輯器裡面,
  • 時間規劃局app如何使用
    您的位置: 專區首頁 > 攻略 > 時間規劃局app如何使用
  • Java 中的 BigDecimal,你真的會用嗎?
    一般情況下,對於那些不需要準確計算精度的數字,我們可以直接使用Float和Double處理,但是Double.valueOf(String) 和Float.valueOf(String)會丟失精度。所以開發中,如果我們需要精確計算的結果,則必須使用BigDecimal類來操作。
  • Java中的BigDecimal,你真的會用嗎?
    一般情況下,對於那些不需要準確計算精度的數字,我們可以直接使用Float和Double處理,但是Double.valueOf(String) 和Float.valueOf(String)會丟失精度。所以開發中,如果我們需要精確計算的結果,則必須使用BigDecimal類來操作。