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

Java的BigDecimal在math包中提供的API類(lèi)場(chǎng)景使用詳解

 更新時(shí)間:2023年12月04日 09:21:30   作者:w7h1te  
這篇文章主要介紹了Java的BigDecimal在math包中提供的API類(lèi)場(chǎng)景使用詳解,BigDecimal,用來(lái)對(duì)超過(guò)16位有效位的數(shù)進(jìn)行精確的運(yùn)算,雙精度浮點(diǎn)型變量double可以處理16位有效數(shù),在實(shí)際應(yīng)用中,需要對(duì)更大或者更小的數(shù)進(jìn)行運(yùn)算和處理,需要的朋友可以參考下

前言

最近在做統(tǒng)計(jì)類(lèi)的業(yè)務(wù)時(shí),遇到一個(gè)求所占百分比的數(shù)據(jù),并且要求保留兩位小數(shù),缺0補(bǔ)0 ,順便記錄學(xué)習(xí)BigDecimal的過(guò)程

代碼如下:

public  void rate() {
    String rate = String.valueOf(new BigDecimal("50")
            .divide(new BigDecimal(Integer.valueOf("50") + Integer.valueOf("4")), 4, BigDecimal.ROUND_HALF_UP)
            .multiply(new BigDecimal("100")).doubleValue());
           System.out.println(rate);//輸出結(jié)果為 92.59 但并沒(méi)完全實(shí)現(xiàn)
}

一、簡(jiǎn)單介紹

BigDecimal,用來(lái)對(duì)超過(guò)16位有效位的數(shù)進(jìn)行精確的運(yùn)算。雙精度浮點(diǎn)型變量double可以處理16位有效數(shù)。在實(shí)際應(yīng)用中,需要對(duì)更大或者更小的數(shù)進(jìn)行運(yùn)算和處理。float和double只能用來(lái)做科學(xué)計(jì)算或者是工程計(jì)算,在商業(yè)計(jì)算中要用java.math.BigDecimal。BigDecimal所創(chuàng)建的是對(duì)象,我們不能使用傳統(tǒng)的+、-、*、/等算術(shù)運(yùn)算符直接對(duì)其對(duì)象進(jìn)行數(shù)學(xué)運(yùn)算,而必須調(diào)用其相對(duì)應(yīng)的方法。方法中的參數(shù)也必須是BigDecimal的對(duì)象。構(gòu)造器是類(lèi)的特殊方法,專(zhuān)門(mén)用來(lái)創(chuàng)建對(duì)象,特別是帶有參數(shù)的對(duì)象。

在我們的日常計(jì)算中,有時(shí)會(huì)涉及到比較大的數(shù)字之間的計(jì)算(如:超大金額的計(jì)算),這時(shí),使用float、double這樣的浮點(diǎn)數(shù)就不那么準(zhǔn)確了。因?yàn)椴徽撌莊loat 還是double都是浮點(diǎn)數(shù),而計(jì)算機(jī)是二進(jìn)制的,浮點(diǎn)數(shù)會(huì)失去一定的精確度。 注:根本原因是:十進(jìn)制值通常沒(méi)有完全相同的二進(jìn)制表示形式;十進(jìn)制數(shù)的二進(jìn)制表示形式可能不精確。

二、使用方法

  • BigDecimal.setScale()方法用于格式化小數(shù)點(diǎn)
  • setScale(1)表示保留一位小數(shù),默認(rèn)用四舍五入方式
  • setScale(1,BigDecimal.ROUND_DOWN)直接刪除多余的小數(shù)位,如2.35會(huì)變成2.3
  • setScale(1,BigDecimal.ROUND_UP)進(jìn)位處理,2.35變成2.4
  • setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35變成2.4
  • setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35變成2.3,如果是5則向下舍
  • setScaler(1,BigDecimal.ROUND_CEILING)接近正無(wú)窮大的舍入
  • setScaler(1,BigDecimal.ROUND_FLOOR)接近負(fù)無(wú)窮大的舍入,數(shù)字>0和ROUND_UP作用一樣,數(shù)字<0和ROUND_DOWN作用一樣
  • setScaler(1,BigDecimal.ROUND_HALF_EVEN)向最接近的數(shù)字舍入,如果與兩個(gè)相鄰數(shù)字的距離相等,則向相鄰的偶數(shù)舍入。

注釋?zhuān)?/p>

1:scale指的是你小數(shù)點(diǎn)后的位數(shù)。比如123.456則score就是3. score()就是BigDecimal類(lèi)中的方法。 比如:BigDecimal b = new BigDecimal(“123.456”); b.scale(),返回的就是3.

2:roundingMode是小數(shù)的保留模式。它們都是BigDecimal中的常量字段,有很多種。 比如:BigDecimal.ROUND_HALF_UP表示的就是4舍5入。

3:pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) 的意思是說(shuō):我用一個(gè)BigDecimal對(duì)象除以divisor后的結(jié)果,并且要求這個(gè)結(jié)果保留有scale個(gè)小數(shù)位,roundingMode表示的就是保留模式是什么,舍入條件可以選擇對(duì)應(yīng)參數(shù)!

4:小數(shù)位格式化使用如下:

        BigDecimal mData = new BigDecimal("5.556").setScale(2, BigDecimal.ROUND_HALF_UP);
        System.out.println("mData=" + mData);//mData=5.56
DecimalFormat df = new DecimalFormat("###.##");
BigDecimal b1 = new BigDecimal("28.0109");
BigDecimal b2 = new BigDecimal("28.00");
System.out.println("小數(shù)格式化:" + df.format(b1));//小數(shù)格式化:28.01
System.out.println("整數(shù)格式化:" + df.format(b2));//整數(shù)格式化:28

三、文中一開(kāi)始遇到的問(wèn)題

想要去除末位0,嘗試如下:

    String waterRate = String.valueOf(new BigDecimal("50")
            .divide(new BigDecimal(Long.valueOf("40") + Long.valueOf("50")), 4, ROUND_HALF_UP)
            .multiply(new BigDecimal("100")));
    System.out.println(waterRate);//55.5600
    String waterRate = String.valueOf(new BigDecimal("50")
            .divide(new BigDecimal(Long.valueOf("40") + Long.valueOf("50")), 2, ROUND_HALF_UP)
            .multiply(new BigDecimal("100")));
   System.out.println(waterRate);//56.00  
    String waterRate = String.valueOf(new BigDecimal("50")
            .divide(new BigDecimal(Long.valueOf("40") + Long.valueOf("50")), 4, ROUND_HALF_UP)
            .multiply(new BigDecimal("100")).floatValue());
    System.out.println(waterRate);//55.56  
            //floatValue() 或者 doubleValue()
   String waterRate = String.valueOf(new BigDecimal("50")
            .divide(new BigDecimal(Long.valueOf("40") + Long.valueOf("50")), 4, ROUND_HALF_UP)
            .multiply(new BigDecimal("100")).doubleValue());
   System.out.println(waterRate);//55.56  兩者都達(dá)到了預(yù)期結(jié)果  但是計(jì)算3/10 結(jié)果為30.0 少補(bǔ)了一位0

1、二者精度不同,對(duì)比兩個(gè)小數(shù)的大小要用doubleValue

2、string轉(zhuǎn)浮點(diǎn)數(shù),也要用doubleValue,否則不準(zhǔn)確

使用去除末位0的方法

String waterRate = String.valueOf(new BigDecimal("50")
        .divide(new BigDecimal(Long.valueOf("40") + Long.valueOf("50")), 4, ROUND_HALF_UP)
        .multiply(new BigDecimal("100.000")).stripTrailingZeros());
System.out.println(waterRate);//55.56  使用去除末位零的方法

但是 當(dāng)我測(cè)試:

    String waterRate = String.valueOf(new BigDecimal("30")
            .divide(new BigDecimal(Long.valueOf("90") + Long.valueOf("10")), 4, ROUND_HALF_UP)
            .multiply(new BigDecimal("100")).stripTrailingZeros());
    System.out.println(waterRate);//輸出結(jié)果:3E+1  顯然不是很符合業(yè)務(wù)邏輯

最終還是得依靠格式轉(zhuǎn)換實(shí)現(xiàn)

    DecimalFormat df1 = new DecimalFormat("0.00%");
    String waterRate = String.valueOf(new BigDecimal("31.1")
            .divide(new BigDecimal(Long.valueOf("90") + Long.valueOf("10")), 4, ROUND_HALF_UP));
    Double rate= Double.valueOf(waterRate);
    System.out.println(df1.format(rate));//輸出結(jié)果:31.10%  實(shí)現(xiàn)了缺0補(bǔ)0

四、引申

關(guān)于Mysql中如何選用double、BigDecimal兩種類(lèi)型

1.首先與java不同的是mysql是用來(lái)持久化數(shù)據(jù)的,而java中使用的數(shù)據(jù)一般更多的是過(guò)一下內(nèi)存;

2.數(shù)據(jù)庫(kù)都要除了指定數(shù)據(jù)類(lèi)型指外還需要指定精度,因此在DB中Double計(jì)算時(shí)精度的丟失比Java高得多;因?yàn)镴ava默認(rèn)精確到15-16位了;

3.更改數(shù)據(jù)類(lèi)型的成本,Mysql比Java代碼要難得多;

考慮到以上與java中不同幾點(diǎn),做點(diǎn)個(gè)人使用總結(jié):

1.與商業(yè)金融相關(guān)字段要使用Decimal來(lái)表示,如金額,費(fèi)率等字段;

2.參與各類(lèi)計(jì)算如加,減,乘,除,sum,avg等等,也要使用Decimal;

3.經(jīng)緯度,可以使用double來(lái)表示,這個(gè)可參考Java,只要保證精度范圍即可;

4.如果確實(shí)不確定使用什么double或Decimal哪種類(lèi)型合適,那最好使用Decimal,畢竟穩(wěn)定,安全高于一切;

注:阿里的編碼規(guī)范中強(qiáng)調(diào)統(tǒng)一帶小數(shù)的類(lèi)型一律使用Decimal類(lèi)型,也是有道理的,使用Decimal可以大大減少計(jì)算踩坑的概率

到此這篇關(guān)于Java的BigDecimal在math包中提供的API類(lèi)場(chǎng)景使用詳解的文章就介紹到這了,更多相關(guān)BigDecimal的API類(lèi)場(chǎng)景使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳細(xì)解讀spring中的@Resource注解

    詳細(xì)解讀spring中的@Resource注解

    這篇文章主要介紹了詳細(xì)解讀spring中的@Resource注解,此注解來(lái)源于JSR規(guī)范(Java?Specification?Requests),其作用是找到依賴的組件注入到應(yīng)用來(lái),它利用了JNDI技術(shù)查找所需的資源,需要的朋友可以參考下
    2023-10-10
  • spring?boot?Mybatis?攔截器實(shí)現(xiàn)拼接sql和修改的代碼詳解

    spring?boot?Mybatis?攔截器實(shí)現(xiàn)拼接sql和修改的代碼詳解

    這篇文章主要介紹了spring?boot?Mybatis?攔截器實(shí)現(xiàn)拼接sql和修改,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • Java比較對(duì)象大小兩種常用方法

    Java比較對(duì)象大小兩種常用方法

    這篇文章主要介紹了Java比較對(duì)象大小兩種常用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • kafka內(nèi)外網(wǎng)訪問(wèn)配置方式

    kafka內(nèi)外網(wǎng)訪問(wèn)配置方式

    這篇文章主要介紹了kafka內(nèi)外網(wǎng)訪問(wèn)配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java實(shí)現(xiàn)多線程大批量同步數(shù)據(jù)(分頁(yè))

    Java實(shí)現(xiàn)多線程大批量同步數(shù)據(jù)(分頁(yè))

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)多線程大批量同步數(shù)據(jù)(分頁(yè)),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Java將字符串String轉(zhuǎn)換為整型Int的兩種方式

    Java將字符串String轉(zhuǎn)換為整型Int的兩種方式

    這篇文章主要介紹了Java如何將字符串String轉(zhuǎn)換為整型Int,在 Java 中要將 String 類(lèi)型轉(zhuǎn)化為 int 類(lèi)型時(shí),需要使用 Integer 類(lèi)中的 parseInt() 方法或者 valueOf() 方法進(jìn)行轉(zhuǎn)換,本文通過(guò)實(shí)例代碼給大家詳細(xì)講解,需要的朋友可以參考下
    2023-04-04
  • JVM Tomcat性能實(shí)戰(zhàn)(推薦)

    JVM Tomcat性能實(shí)戰(zhàn)(推薦)

    下面小編就為大家?guī)?lái)一篇JVM Tomcat性能實(shí)戰(zhàn)(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05
  • SparkStreaming-Kafka通過(guò)指定偏移量獲取數(shù)據(jù)實(shí)現(xiàn)

    SparkStreaming-Kafka通過(guò)指定偏移量獲取數(shù)據(jù)實(shí)現(xiàn)

    這篇文章主要為大家介紹了SparkStreaming-Kafka通過(guò)指定偏移量獲取數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • servlet3文件上傳操作

    servlet3文件上傳操作

    這篇文章主要介紹了servlet3文件上傳操作的相關(guān)資料,需要的朋友可以參考下
    2017-11-11
  • Kotlin與Java 泛型缺陷和應(yīng)用場(chǎng)景詳解

    Kotlin與Java 泛型缺陷和應(yīng)用場(chǎng)景詳解

    這篇文章主要為大家介紹了Kotlin與Java 泛型缺陷和應(yīng)用場(chǎng)景詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12

最新評(píng)論