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

介紹Java的大數(shù)類(BigDecimal)和八種舍入模式

 更新時間:2016年08月15日 17:01:30   作者:亦楓  
在實際應(yīng)用中,需要對更大或者更小的數(shù)進行運算和處理。Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數(shù)進行精確的運算。本文將介紹Java中的大數(shù)類BigDecimal及其八種舍入模式,有需要的可以參考借鑒。

1.BigDecimal簡介

BigDecimal 由任意精度的整數(shù)非標(biāo)度值 和32 位的整數(shù)標(biāo)度 (scale) 組成。如果為零或正數(shù),則標(biāo)度是小數(shù)點后的位數(shù)。如果為負數(shù),則將該數(shù)的非標(biāo)度值乘以 10 的負scale 次冪。因此,BigDecimal表示的數(shù)值是(unscaledValue × 10-scale)。

2.BigDecimal的引入

在利用Java編程語言開發(fā)銀行、金融類等需要對數(shù)值進行高精度計算的軟件時,我們經(jīng)常使用BigDecimalBigInteger這兩個大數(shù)類,而不是常見的int、longfloat、double類型,特別是在處理浮點型數(shù)據(jù)。

我們先看一下使用基礎(chǔ)數(shù)據(jù)類型double進行計算并打印結(jié)果的一個代碼演示:

public class MainClass {

  public static void main(String[] args) {
    System.out.println(0.02+0.01);
    System.out.println(0.05+0.01);
  }

}

結(jié)果如下:

0.03
0.060000000000000005

問題來了,為什么會出現(xiàn)第二種結(jié)果的數(shù)據(jù)呢?根本原因還是我們的計算機是由二進制的,而二進制是沒辦法來精確表示一個浮點數(shù),CPU采用“尾數(shù)和指數(shù)”的方式(科學(xué)計數(shù)法)表達浮點數(shù)的時候存在一定的誤差。所以,當(dāng)對數(shù)據(jù)精度要求比較高的時候,還是需要采用BigDecimal類,盡管計算速度上稍微慢了一些。

3.BigDecimal的使用

創(chuàng)建一個BigDecimal對象有構(gòu)造函數(shù)和公有靜態(tài)方法(BigDecimal.valueOf)兩種方式,需要注意兩點:

      1、構(gòu)造函數(shù)包含使用基本數(shù)據(jù)類型和字符串作為參數(shù)的兩種形式,推薦使用后者,如:new BigDecimal(Double.valueOf(0.09))。大家可以嘗試一下,System.out.println(new BigDecimal(0.06).toString());語句的輸出結(jié)果是:0.059999999999999997779553950749686919152736663818359375

      2、Decimal打印日志或向基本數(shù)據(jù)類型轉(zhuǎn)換時,盡量使用它提供的公有方法xxxValue(),比如doubleValue(),而不是簡單粗暴的一個toString()

4.BigDecimal舍入模式

盡管數(shù)據(jù)庫存儲的是一個高精度的浮點數(shù),但是通常在應(yīng)用中展示的時候往往需要限制一下小數(shù)點的位數(shù),比如兩到三位小數(shù)即可,這時就需要使用到setScale(int newScale, int roundingMode)函數(shù),作為BigDecimal的公有靜態(tài)變量,舍入模式(Rounding Mode)的運算規(guī)則比較多,公有八種,這里作個說明,官方文檔也有介紹。

1、ROUND_UP

向遠離零的方向舍入。舍棄非零部分,并將非零舍棄部分相鄰的一位數(shù)字加一。

2、ROUND_DOWN

向接近零的方向舍入。舍棄非零部分,同時不會非零舍棄部分相鄰的一位數(shù)字加一,采取截取行為。

3、ROUND_CEILING

向正無窮的方向舍入。如果為正數(shù),舍入結(jié)果同ROUND_UP一致;如果為負數(shù),舍入結(jié)果同ROUND_DOWN一致。注意:此模式不會減少數(shù)值大小。

4、ROUND_FLOOR

向負無窮的方向舍入。如果為正數(shù),舍入結(jié)果同ROUND_DOWN一致;如果為負數(shù),舍入結(jié)果同ROUND_UP一致。注意:此模式不會增加數(shù)值大小。

5、ROUND_HALF_UP

向“最接近”的數(shù)字舍入,如果與兩個相鄰數(shù)字的距離相等,則為向上舍入的舍入模式。如果舍棄部分>= 0.5,則舍入行為與ROUND_UP相同;否則舍入行為與ROUND_DOWN相同。這種模式也就是我們常說的我們的“四舍五入”。

6、ROUND_HALF_DOWN

向“最接近”的數(shù)字舍入,如果與兩個相鄰數(shù)字的距離相等,則為向下舍入的舍入模式。如果舍棄部分> 0.5,則舍入行為與ROUND_UP相同;否則舍入行為與ROUND_DOWN相同。這種模式也就是我們常說的我們的“五舍六入”。

7、ROUND_HALF_EVEN

向“最接近”的數(shù)字舍入,如果與兩個相鄰數(shù)字的距離相等,則相鄰的偶數(shù)舍入。如果舍棄部分左邊的數(shù)字奇數(shù),則舍入行為與 ROUND_HALF_UP 相同;如果為偶數(shù),則舍入行為與 ROUND_HALF_DOWN 相同。注意:在重復(fù)進行一系列計算時,此舍入模式可以將累加錯誤減到最小。此舍入模式也稱為“銀行家舍入法”,主要在美國使用。四舍六入,五分兩種情況,如果前一位為奇數(shù),則入位,否則舍去。

8、ROUND_UNNECESSARY

斷言請求的操作具有精確的結(jié)果,因此不需要舍入。如果對獲得精確結(jié)果的操作指定此舍入模式,則拋出ArithmeticException。

下面,舉個例子說明一下不同舍入模式下的數(shù)值計算結(jié)果,保留一位小數(shù):

5.總結(jié)

以上就是Java大數(shù)類BigDecimal及八種舍入模式的介紹的全部內(nèi)容,希望本文的內(nèi)容對大家學(xué)習(xí)Java能有所幫助。

相關(guān)文章

  • 通過Java實現(xiàn)文件斷點續(xù)傳功能

    通過Java實現(xiàn)文件斷點續(xù)傳功能

    用戶上傳大文件,網(wǎng)絡(luò)差點的需要歷時數(shù)小時,萬一線路中斷,不具備斷點續(xù)傳的服務(wù)器就只能從頭重傳,而斷點續(xù)傳就是,允許用戶從上傳斷線的地方繼續(xù)傳送,這樣大大減少了用戶的煩惱。本文將用Java語言實現(xiàn)斷點續(xù)傳,需要的可以參考一下
    2022-05-05
  • 解決swagger2.9.2接口文檔顯示的問題

    解決swagger2.9.2接口文檔顯示的問題

    這篇文章主要介紹了解決swagger2.9.2接口文檔顯示的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • java8中新的Date和Time詳解

    java8中新的Date和Time詳解

    這篇文章主要是java8中新的Date和Time,探討新Date類和Time類背后的設(shè)計原則,有所需要的小伙伴希望能幫助到你
    2016-07-07
  • Java對象Serializable接口實現(xiàn)詳解

    Java對象Serializable接口實現(xiàn)詳解

    這篇文章主要介紹了Java對象Serializable接口實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • SpringBoot接收與響應(yīng)xml報文請求的實現(xiàn)

    SpringBoot接收與響應(yīng)xml報文請求的實現(xiàn)

    我們在進行接口對接時,會出現(xiàn)報文形式的信息傳遞,這篇文章主要給大家介紹了關(guān)于SpringBoot接收與響應(yīng)xml報文請求的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • Java并發(fā)編程之線程創(chuàng)建介紹

    Java并發(fā)編程之線程創(chuàng)建介紹

    這篇文章主要介紹了Java并發(fā)編程之線程創(chuàng)建,進程是代碼在數(shù)據(jù)集合上的一次運行活動,是系統(tǒng)進行資源分配和調(diào)度的基本單位,線程則是一個實體,一個進程中至少有一個線程,下文更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-04-04
  • 利用Spring?boot+LogBack+MDC實現(xiàn)鏈路追蹤

    利用Spring?boot+LogBack+MDC實現(xiàn)鏈路追蹤

    這篇文章主要介紹了利用Spring?boot+LogBack+MDC實現(xiàn)鏈路追蹤,MDC?可以看成是一個與當(dāng)前線程綁定的哈希表,可以往其中添加鍵值對,下文詳細介紹需要的小伙伴可以參考一下
    2022-04-04
  • SpringMVC實現(xiàn)文件上傳和下載的工具類

    SpringMVC實現(xiàn)文件上傳和下載的工具類

    這篇文章主要為大家詳細介紹了SpringMVC實現(xiàn)文件上傳和下載的工具類,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Servlet實現(xiàn)文件下載功能

    Servlet實現(xiàn)文件下載功能

    這篇文章主要為大家詳細介紹了Servlet實現(xiàn)文件下載功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Java 如何將 byte[] 轉(zhuǎn)換為 File 對象

    Java 如何將 byte[] 轉(zhuǎn)換為 File 對象

    本文介紹了如何將字節(jié)數(shù)組(byte[])轉(zhuǎn)換為文件對象(File)的方法,提供了具體代碼示例,代碼簡單易懂,感興趣的朋友跟隨小編一起看看吧
    2025-03-03

最新評論

县级市| 常德市| 禹州市| 潼南县| 八宿县| 波密县| 宝鸡市| 连城县| 平利县| 甘孜| 淮北市| 龙川县| 宜兰市| 海安县| 德保县| 团风县| 普宁市| 靖西县| 略阳县| 原平市| 宝坻区| 宽城| 界首市| 樟树市| 莲花县| 东阳市| 叶城县| 岫岩| 响水县| 蒙自县| 临漳县| 灵宝市| 陵水| 托克托县| 和龙市| 西林县| 绥阳县| 津南区| 舒兰市| 黔西县| 民权县|