最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

介紹:

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

公式加法計(jì)算~add

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

結(jié)果集: 

公式減法計(jì)算~subtract

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

結(jié)果集:

公式乘法計(jì)算~multiply

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

結(jié)果集:

公式除法計(jì)算~divide

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

結(jié)果集:

二、 BigDecimal(舍入模式)選擇

簡介:

BigDecimal.setScale主要用于對BigDecimal數(shù)據(jù)小數(shù)點(diǎn)后的位數(shù)進(jìn)行 進(jìn)位、舍位、截?cái)嗟炔僮?/p>

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

1、ROUND_UP:向遠(yuǎn)離零的方向舍入。

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

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

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

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

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

4、ROUND_FLOOR:向負(fù)無窮大的方向舍入。

        若 BigDecimal 為正,則舍入行為與 ROUND_DOWN 相同;若為負(fù),則舍入行為與 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

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

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

案例: 

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

結(jié)果集:

計(jì)算器結(jié)果集如下圖:

三、 BigDecimal.setScale用法案例

BigDecimal.setScale主要用于對BigDecimal數(shù)據(jù)小數(shù)點(diǎn)后的位數(shù)進(jìn)行 進(jìn)位、舍位、截?cái)嗟炔僮?/strong>

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

結(jié)果集:

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

介紹:

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

以如下代碼為例:

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

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

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

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

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

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

 結(jié)果集如下:

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

總結(jié)

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

相關(guān)文章

  • IDEA最新激活碼2021(IDEA2020.3.2最新永久激活方法)

    IDEA最新激活碼2021(IDEA2020.3.2最新永久激活方法)

    這篇文章主要介紹了IDEA最新激活碼2021(IDEA2020.3.2最新永久激活方法),本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 使用feign客戶端傳參接收不到的問題及解決

    使用feign客戶端傳參接收不到的問題及解決

    這篇文章主要介紹了使用feign客戶端傳參接收不到的問題及解決,具有很好的參考價(jià)值,希望對大家有所幫助。
    2022-03-03
  • Springboot maven plugin插件原理及作用

    Springboot maven plugin插件原理及作用

    這篇文章主要介紹了Springboot maven plugin插件原理及作用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • mybatis-spring:@MapperScan注解的使用

    mybatis-spring:@MapperScan注解的使用

    這篇文章主要介紹了mybatis-spring:@MapperScan注解的使用,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 解決IDEA中快捷鍵Alt+Enter不能使用的問題

    解決IDEA中快捷鍵Alt+Enter不能使用的問題

    這篇文章主要介紹了解決IDEA中快捷鍵Alt+Enter不能使用的問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • java垃圾回收之實(shí)現(xiàn)并行GC算法

    java垃圾回收之實(shí)現(xiàn)并行GC算法

    這篇文章主要為大家介紹了java垃圾回收之實(shí)現(xiàn)并行GC算法的詳細(xì)講解,讓我們看看并行垃圾收集器的GC日志長什么樣,?從中我們可以得到哪些有用信息
    2022-01-01
  • MyBatis-plus 模糊查詢的使用

    MyBatis-plus 模糊查詢的使用

    這篇文章主要介紹了MyBatis-plus 模糊查詢的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java中的MultipartFile接口和File類解讀

    Java中的MultipartFile接口和File類解讀

    本文主要介紹了Java中的File類和Spring框架中的MultipartFile接口,File類提供了對文件和目錄操作的方法,如創(chuàng)建、刪除、重命名、判斷文件是否存在等,MultipartFile接口用于處理文件上傳,提供了獲取上傳文件信息和保存上傳文件的方法
    2025-02-02
  • IntelliJ?IDEA?2021.3永久最新激活至2099年(親測有效)

    IntelliJ?IDEA?2021.3永久最新激活至2099年(親測有效)

    最新版idea2021.3已出來,很多網(wǎng)友迫不及待的要升級idea2021最新版,今天小編抽空給大家整理了一篇教程關(guān)于idea2021.3最新激活教程,本文以idea2021.2.3為例通過圖文并茂的形式給大家分享激活詳細(xì)過程,感興趣的朋友參考下吧
    2020-12-12
  • SpringBoot整合EasyExcel實(shí)現(xiàn)文件導(dǎo)入導(dǎo)出

    SpringBoot整合EasyExcel實(shí)現(xiàn)文件導(dǎo)入導(dǎo)出

    這篇文章主要介紹了SpringBoot整合EasyExcel實(shí)現(xiàn)文件導(dǎo)入導(dǎo)出的方法,幫助大家更好的理解和學(xué)習(xí)使用SpringBoot,感興趣的朋友可以了解下
    2021-05-05

最新評論

甘肃省| 惠州市| 普兰县| 民丰县| 康定县| 包头市| 卢湾区| 曲阜市| 芦溪县| 包头市| 曲麻莱县| 湟中县| 巴林左旗| 泰州市| 琼中| 常山县| 西乡县| 耿马| 西乡县| 乡城县| 洞头县| 罗甸县| 宜宾县| 湖口县| 马公市| 沅江市| 富蕴县| 内江市| 阿瓦提县| 乌鲁木齐市| 体育| 襄樊市| 晋宁县| 崇文区| 岳西县| 彭水| 杭锦后旗| 贡觉县| 千阳县| 阜新| 榕江县|