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

Java的BigDecimal在math包中提供的API類場景使用詳解

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

前言

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

代碼如下:

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);//輸出結果為 92.59 但并沒完全實現(xiàn)
}

一、簡單介紹

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

在我們的日常計算中,有時會涉及到比較大的數(shù)字之間的計算(如:超大金額的計算),這時,使用float、double這樣的浮點數(shù)就不那么準確了。因為不論是float 還是double都是浮點數(shù),而計算機是二進制的,浮點數(shù)會失去一定的精確度。 注:根本原因是:十進制值通常沒有完全相同的二進制表示形式;十進制數(shù)的二進制表示形式可能不精確。

二、使用方法

  • BigDecimal.setScale()方法用于格式化小數(shù)點
  • setScale(1)表示保留一位小數(shù),默認用四舍五入方式
  • setScale(1,BigDecimal.ROUND_DOWN)直接刪除多余的小數(shù)位,如2.35會變成2.3
  • setScale(1,BigDecimal.ROUND_UP)進位處理,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)接近正無窮大的舍入
  • setScaler(1,BigDecimal.ROUND_FLOOR)接近負無窮大的舍入,數(shù)字>0和ROUND_UP作用一樣,數(shù)字<0和ROUND_DOWN作用一樣
  • setScaler(1,BigDecimal.ROUND_HALF_EVEN)向最接近的數(shù)字舍入,如果與兩個相鄰數(shù)字的距離相等,則向相鄰的偶數(shù)舍入。

注釋:

1:scale指的是你小數(shù)點后的位數(shù)。比如123.456則score就是3. score()就是BigDecimal類中的方法。 比如: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) 的意思是說:我用一個BigDecimal對象除以divisor后的結果,并且要求這個結果保留有scale個小數(shù)位,roundingMode表示的就是保留模式是什么,舍入條件可以選擇對應參數(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

三、文中一開始遇到的問題

想要去除末位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  兩者都達到了預期結果  但是計算3/10 結果為30.0 少補了一位0

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

2、string轉浮點數(shù),也要用doubleValue,否則不準確

使用去除末位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  使用去除末位零的方法

但是 當我測試:

    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);//輸出結果:3E+1  顯然不是很符合業(yè)務邏輯

最終還是得依靠格式轉換實現(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));//輸出結果:31.10%  實現(xiàn)了缺0補0

四、引申

關于Mysql中如何選用double、BigDecimal兩種類型

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

2.數(shù)據(jù)庫都要除了指定數(shù)據(jù)類型指外還需要指定精度,因此在DB中Double計算時精度的丟失比Java高得多;因為Java默認精確到15-16位了;

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

考慮到以上與java中不同幾點,做點個人使用總結:

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

2.參與各類計算如加,減,乘,除,sum,avg等等,也要使用Decimal;

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

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

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

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

相關文章

  • Java線程編程中isAlive()和join()的使用詳解

    Java線程編程中isAlive()和join()的使用詳解

    這篇文章主要介紹了Java線程編程中isAlive()和join()的使用詳解,是Java入門學習中的基礎知識,需要的朋友可以參考下
    2015-09-09
  • echarts圖表導出excel示例

    echarts圖表導出excel示例

    這篇文章主要介紹了echarts圖表導出excel示例,需要的朋友可以參考下
    2014-04-04
  • java正則表達式提取數(shù)字的方法實例

    java正則表達式提取數(shù)字的方法實例

    這篇文章主要介紹了java正則表達式提取數(shù)字的方法,還有去除字符串數(shù)字的方法,大家參考使用吧
    2013-12-12
  • Java實現(xiàn)samza轉換成flink

    Java實現(xiàn)samza轉換成flink

    將Apache Samza作業(yè)遷移到Apache Flink作業(yè)是一個復雜的任務,因為這兩個流處理框架有不同的API和架構,本文我們就來看看如何使用Java實現(xiàn)samza轉換成flink吧
    2024-11-11
  • Java?中的?synchronized?關鍵字詳解

    Java?中的?synchronized?關鍵字詳解

    本文詳細介紹了Java中的synchronized關鍵字,包括其基本概念、工作原理、使用場景、性能優(yōu)化技巧以及常見問題與解決方案,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • 詳解Java中的實例初始化塊(IIB)

    詳解Java中的實例初始化塊(IIB)

    在本篇文章里我們針對Java中的實例初始化塊(IIB)做想詳細分析,有需要的朋友們可以跟著學習參考下。
    2018-10-10
  • java并發(fā)包工具CountDownLatch源碼分析

    java并發(fā)包工具CountDownLatch源碼分析

    這篇文章主要為大家介紹了java并發(fā)包工具CountDownLatch源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Spring中的監(jiān)聽器SpringApplicationRunListener詳解

    Spring中的監(jiān)聽器SpringApplicationRunListener詳解

    這篇文章主要介紹了Spring中的監(jiān)聽器SpringApplicationRunListener詳解,命名我們就可以知道它是一個監(jiān)聽者,分析springboot啟動流程我們會發(fā)現(xiàn),它其實是用來在整個啟動流程中接收不同執(zhí)行點事件通知的監(jiān)聽者,需要的朋友可以參考下
    2023-11-11
  • Java中的原子類詳解

    Java中的原子類詳解

    這篇文章主要介紹了Java中的原子類詳解,Java原子類是一種多線程編程中常用的工具,用于實現(xiàn)線程安全的操作,它們提供了一種原子性操作的機制,確保多個線程同時訪問共享變量時的數(shù)據(jù)一致性,需要的朋友可以參考下
    2023-10-10
  • 如何使用XPath提取xml文檔數(shù)據(jù)

    如何使用XPath提取xml文檔數(shù)據(jù)

    這篇文章主要介紹了如何使用XPath提取xml文檔數(shù)據(jù),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08

最新評論

苍梧县| 五原县| 固阳县| 武城县| 铜陵市| 班玛县| 宁阳县| 达孜县| 应城市| 佛坪县| 武宁县| 三原县| 鄱阳县| 浏阳市| 邢台县| 广德县| 钟山县| 若尔盖县| 饶河县| 白玉县| 昭苏县| 彰化县| 阿荣旗| 永平县| 汉阴县| 富源县| 隆林| 漳平市| 长沙县| 邢台县| 潢川县| 蒙城县| 南昌县| 大邑县| 宾阳县| 泌阳县| 岗巴县| 东安县| 天柱县| 香港 | 南投县|