欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java使用BigDecimal公式精確計算及精度丟失問題

 更新時間:2023年01月30日 08:52:02   作者:你才是臭弟弟  
在工作中經常會遇到數(shù)值精度問題,比如說使用float或者double的時候,可能會有精度丟失問題,下面這篇文章主要給大家介紹了關于Java使用BigDecimal公式精確計算及精度丟失問題的相關資料,需要的朋友可以參考下

一、Java使用BigDecimal公式計算(精確計算)

介紹:

       使用BigDecimal加減乘除方法運算,可以使用BigDecimal類提供的add、subtract、multiply、divide方法函數(shù)實現(xiàn)。

公式加法計算~add

  public  static void main(String[] args){
       BigDecimal a = BigDecimal.valueOf(5.6);
 
       BigDecimal b = BigDecimal.valueOf(2.1);
 
       //BigDecimal計算add
       BigDecimal addResult = a.add(b);
       System.out.println("結果集: " +addResult);
   }

結果集: 

公式減法計算~subtract

public  static void main(String[] args){
       BigDecimal a = BigDecimal.valueOf(5.6);
 
       BigDecimal b = BigDecimal.valueOf(2.1);
 
       BigDecimal計算subtract
       BigDecimal subtract = a.subtract(b);
 
       System.out.println("結果集subtract: " +subtract);
   }

結果集:

公式乘法計算~multiply

public  static void main(String[] args){
       BigDecimal a = BigDecimal.valueOf(5.6);
       BigDecimal b = BigDecimal.valueOf(2.1);
       BigDecimal計算multiply
       BigDecimal multiply = a.multiply(b);
       System.out.println("結果集: " +multiply);
   }

結果集:

公式除法計算~divide

public  static void main(String[] args){
       BigDecimal a = BigDecimal.valueOf(5.6);
       BigDecimal b = BigDecimal.valueOf(2.1);
       //BigDecimal計算divide
       //ROUND_HALF_UP:向“最接近的”整數(shù)舍入。 若舍入位大于等于5,則對舍入部分的前一位數(shù)字加1;若舍入位小于5,則直接舍棄。即為四舍五入模式。
       BigDecimal divide = a.divide(b,2,BigDecimal.ROUND_HALF_UP);//四舍五入,保留兩位小數(shù).
 
       System.out.println("結果集: " +divide);
   }

結果集:

二、 BigDecimal(舍入模式)選擇

簡介:

BigDecimal.setScale主要用于對BigDecimal數(shù)據(jù)小數(shù)點后的位數(shù)進行 進位、舍位、截斷等操作

java.math.RoundingMode:這是一種枚舉類型,它定義了8種數(shù)據(jù)的舍入模式。它與java.math.BigDecimal類中定義的8個同名靜態(tài)常量的作用相同,可用BigDecimal.setScale(int newScale, RoundingMode roundingMode)來設置數(shù)據(jù)的精度和舍入模式。
 

1、ROUND_UP:向遠離零的方向舍入。

        若舍入位為非零,則對舍入部分的前一位數(shù)字加1;若舍入位為零,則直接舍棄。即為向外取整模式。

2、ROUND_DOWN:向接近零的方向舍入。

        不論舍入位是否為零,都直接舍棄。即為向內取整模式。

3、ROUND_CEILING:向正無窮大的方向舍入。

        若 BigDecimal 為正,則舍入行為與 ROUND_UP 相同;若為負,則舍入行為與 ROUND_DOWN 相同。即為向上取整模式。

4、ROUND_FLOOR:向負無窮大的方向舍入。

        若 BigDecimal 為正,則舍入行為與 ROUND_DOWN 相同;若為負,則舍入行為與 ROUND_UP 相同。即為向下取整模式。

5、ROUND_HALF_UP:向“最接近的”整數(shù)舍入。

        若舍入位大于等于5,則對舍入部分的前一位數(shù)字加1;若舍入位小于5,則直接舍棄。即為四舍五入模式。

6、ROUND_HALF_DOWN:向“最接近的”整數(shù)舍入。

        若舍入位大于5,則對舍入部分的前一位數(shù)字加1;若舍入位小于等于5,則直接舍棄。即為五舍六入模式。

7、ROUND_HALF_EVEN:向“最接近的”整數(shù)舍入。

        若(舍入位大于5)或者(舍入位等于5且前一位為奇數(shù)),則對舍入部分的前一位數(shù)字加1;

        若(舍入位小于5)或者(舍入位等于5且前一位為偶數(shù)),則直接舍棄。即為銀行家舍入模式。

8、ROUND_UNNECESSARY

        斷言請求的操作具有精確的結果,因此不需要舍入。

        如果對獲得精確結果的操作指定此舍入模式,則拋出ArithmeticException。

案例: 

 public  static void main(String[] args){
       BigDecimal a = BigDecimal.valueOf(5.6);
       BigDecimal b = BigDecimal.valueOf(2.1);
       //BigDecimal計算divide
       //ROUND_HALF_UP:向“最接近的”整數(shù)舍入。 若舍入位大于等于5,則對舍入部分的前一位數(shù)字加1;若舍入位小于5,則直接舍棄。即為四舍五入模式。
       //ROUND_UP:向遠離零的方向舍入。  若舍入位為非零,則對舍入部分的前一位數(shù)字加1;若舍入位為零,則直接舍棄。即為向外取整模式。
       BigDecimal divide = a.divide(b,BigDecimal.ROUND_HALF_UP, 2).setScale(2,ROUND_UP);
 
       System.out.println("結果集: " +divide);
   }

結果集:

計算器結果集如下圖:

三、 BigDecimal.setScale用法案例

BigDecimal.setScale主要用于對BigDecimal數(shù)據(jù)小數(shù)點后的位數(shù)進行 進位、舍位、截斷等操作

public  static void main(String[] args){
       BigDecimal a = BigDecimal.valueOf(5.6);
       BigDecimal b = BigDecimal.valueOf(2.1);
       //BigDecimal計算divide
       BigDecimal divide = a.divide(b,2,BigDecimal.ROUND_UP).setScale(2, BigDecimal.ROUND_UP);
 
       System.out.println("結果集: " +divide);
   }

結果集:

四、Java使用BigDecimal精度丟失問題

介紹:

在實際應用中,經常會使用到計算,舉例如 '銀行' 特別是在我們交易的時候,計算結果要求的更加精確,這個時候我們就會使用到java.math包中提供的API類BigDecimal,用于對超過16位有效位數(shù)的數(shù)字進行精確的計算。

以如下代碼為例:

public  static void main(String[] args){
       System.out.println("使用bigDecimal進行轉換"+new BigDecimal(234.567));
   }

運行后結果集出現(xiàn)精度丟失: 

結果可以看出使用new BigDecimal(234.567),傳入?yún)?shù)為double類型發(fā)生精度丟失,運行的結果并不等于234.567,而是為234.5670000000000072759576141834259033203125。

原因是double不能表示為任何有限長度的二進制小數(shù);

解決方法:     使用new BigDecimal(String)構造函數(shù),創(chuàng)建一個參數(shù)以字符串表示數(shù)值的對象

public  static void main(String[] args){
       double a = 234.567;
       String  b = "234.567";
       // 方式一:double的封裝類Double中的toString()方法解決
       System.out.println("使用bigDecimal進行轉換" + new BigDecimal(new Double(a).toString()));
 
       // 方式二:使用String接收數(shù)值
       System.out.println("使用bigDecimal進行轉換" + new BigDecimal(b));
   }

 結果集如下:

如需使用加減乘除方法運算,可以使用BigDecimal類提供的add、subtract、multiply、divide方法實現(xiàn) 如上:Java使用BigDecimal公式計算

總結

到此這篇關于Java使用BigDecimal公式精確計算及精度丟失問題的文章就介紹到這了,更多相關Java使用BigDecimal公式精確計算內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java8 CompletableFuture詳解

    Java8 CompletableFuture詳解

    這篇文章主要介紹了Java8 CompletableFuture詳解,CompletableFuture extends Future提供了方法,一元操作符和促進異步性以及事件驅動編程模型,需要的朋友可以參考下
    2014-06-06
  • Postman實現(xiàn)傳List<String>集合

    Postman實現(xiàn)傳List<String>集合

    這篇文章主要介紹了Postman實現(xiàn)傳List<String>集合方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java多線程 樂觀鎖和CAS機制詳細

    Java多線程 樂觀鎖和CAS機制詳細

    這篇文章主要介紹了Java多線程 樂觀鎖和CAS機制,樂觀鎖是對于數(shù)據(jù)沖突保持一種樂觀態(tài)度,操作數(shù)據(jù)時不會對操作的數(shù)據(jù)進行加鎖,需要的朋友可以參考下
    2021-10-10
  • Map如何根據(jù)key指定條件進行過濾篩選

    Map如何根據(jù)key指定條件進行過濾篩選

    這篇文章主要介紹了Map如何根據(jù)key指定條件進行過濾篩選問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java返回可變引用對象問題整理

    Java返回可變引用對象問題整理

    在本篇文章里小編給大家分享的是關于Java返回可變引用對象問題整理內容,需要的朋友們可以學習下。
    2020-04-04
  • Java使用協(xié)同過濾算法的代碼示例

    Java使用協(xié)同過濾算法的代碼示例

    在Java中實現(xiàn)協(xié)同過濾算法通常需要一些步驟,包括加載用戶-項目評分數(shù)據(jù)、計算相似度、生成推薦等,以下是一個簡化的基于用戶的協(xié)同過濾算法的代碼示例,感興趣的小伙伴跟著小編一起來看看吧
    2024-06-06
  • Java動態(tài)代理分析及簡單實例

    Java動態(tài)代理分析及簡單實例

    這篇文章主要介紹了 Java動態(tài)代理分析及簡單實例的相關資料,需要的朋友可以參考下
    2017-02-02
  • Java的CollectionUtils工具類詳解

    Java的CollectionUtils工具類詳解

    這篇文章主要介紹了Java的CollectionUtils工具類詳解,CollectionUtils工具類是在apache下的,而不是springframework下的,個人覺得在真實項目中CollectionUtils,可以使你的代碼更加簡潔和安全,需要的朋友可以參考下
    2023-05-05
  • java類成員中的訪問級別淺析

    java類成員中的訪問級別淺析

    在本篇文章里小編給大家整理的是一篇關于java類成員中的訪問級別淺析內容,有興趣的朋友們跟著學習下。
    2021-01-01
  • Redis實現(xiàn)商品秒殺功能頁面流程

    Redis實現(xiàn)商品秒殺功能頁面流程

    這篇文章主要介紹了Redis實現(xiàn)商品秒殺功能的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-09-09

最新評論