亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

1.BigDecimal簡介

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

2.BigDecimal的引入

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

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

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ù)呢?根本原因還是我們的計(jì)算機(jī)是由二進(jìn)制的,而二進(jìn)制是沒辦法來精確表示一個(gè)浮點(diǎn)數(shù),CPU采用“尾數(shù)和指數(shù)”的方式(科學(xué)計(jì)數(shù)法)表達(dá)浮點(diǎn)數(shù)的時(shí)候存在一定的誤差。所以,當(dāng)對數(shù)據(jù)精度要求比較高的時(shí)候,還是需要采用BigDecimal類,盡管計(jì)算速度上稍微慢了一些。

3.BigDecimal的使用

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

      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)換時(shí),盡量使用它提供的公有方法xxxValue(),比如doubleValue(),而不是簡單粗暴的一個(gè)toString()

4.BigDecimal舍入模式

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

1、ROUND_UP

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

2、ROUND_DOWN

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

3、ROUND_CEILING

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

4、ROUND_FLOOR

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

5、ROUND_HALF_UP

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

6、ROUND_HALF_DOWN

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

7、ROUND_HALF_EVEN

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

8、ROUND_UNNECESSARY

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

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

5.總結(jié)

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

相關(guān)文章

  • Spring事件Application Event原理詳解

    Spring事件Application Event原理詳解

    這篇文章主要介紹了Spring 事件Application Event原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • JDBC數(shù)據(jù)源連接池配置及應(yīng)用

    JDBC數(shù)據(jù)源連接池配置及應(yīng)用

    這篇文章主要介紹JDBC建立數(shù)據(jù)庫連接的兩種方式,使用配置數(shù)據(jù)源的方式連接數(shù)據(jù)庫,效率更高,推薦使用,希望能給大家做一個(gè)參考。
    2016-06-06
  • 詳解快速搭建Spring Boot+Spring MVC

    詳解快速搭建Spring Boot+Spring MVC

    本篇文章主要介紹了詳解快速搭建Spring Boot+Spring MVC,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • Mybatis-Plus中updateById方法不能更新空值問題解決

    Mybatis-Plus中updateById方法不能更新空值問題解決

    本文主要介紹了Mybatis-Plus中updateById方法不能更新空值問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • java使用Runtime執(zhí)行系統(tǒng)命令遇到的問題

    java使用Runtime執(zhí)行系統(tǒng)命令遇到的問題

    這篇文章主要介紹了java使用Runtime執(zhí)行系統(tǒng)命令遇到的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 深入淺出解析Java ThreadLocal原理

    深入淺出解析Java ThreadLocal原理

    ThreadLocal是JDK包提供的,它提供線程本地變量,如果創(chuàng)建一樂ThreadLocal變量,那么訪問這個(gè)變量的每個(gè)線程都會有這個(gè)變量的一個(gè)副本,在實(shí)際多線程操作的時(shí)候,操作的是自己本地內(nèi)存中的變量,從而規(guī)避了線程安全問題,感興趣的朋友快來看看吧
    2021-11-11
  • java操作mysql實(shí)現(xiàn)增刪改查的方法

    java操作mysql實(shí)現(xiàn)增刪改查的方法

    這篇文章主要介紹了java操作mysql實(shí)現(xiàn)增刪改查的方法,結(jié)合實(shí)例形式分析了java操作mysql數(shù)據(jù)庫進(jìn)行增刪改查的具體實(shí)現(xiàn)技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-05-05
  • JFreeChart簡單實(shí)現(xiàn)光滑曲線繪制

    JFreeChart簡單實(shí)現(xiàn)光滑曲線繪制

    這篇文章主要為大家詳細(xì)介紹了JFreeChart簡單實(shí)現(xiàn)光滑曲線的繪制,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • SpringBoot中將@Bean方法解析為BeanDefinition詳解

    SpringBoot中將@Bean方法解析為BeanDefinition詳解

    這篇文章主要介紹了SpringBoot中將@Bean方法解析為BeanDefinition詳解,得到的BeanDefinition是ConfigurationClassBeanDefinition類型,會為BeanDefinition設(shè)置factoryMethodName,這意味著當(dāng)實(shí)例化這個(gè)bean的時(shí)候?qū)⒉捎霉S方法,需要的朋友可以參考下
    2023-12-12
  • Springboot-yaml配置和自動配置原理分析

    Springboot-yaml配置和自動配置原理分析

    這篇文章主要介紹了Springboot-yaml配置和自動配置原理分析,自動配置原理是配置文件配置debug: true可以在控制臺打印自動配置報(bào)告.可以打印所有的啟動的自動配置和沒有啟動的自動配置類,需要的朋友可以參考下
    2021-06-06

最新評論