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

Java中BigDecimal,DateFormatter?和迭代器的"陷阱"

 更新時(shí)間:2022年06月10日 09:30:19   作者:??黎曼假設(shè)????  
這篇文章主要介紹了Java中BigDecimal,DateFormatter?和迭代器的"陷阱",文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,感興趣的小伙伴可以參考一下

前言:

使用 IDEA 創(chuàng)建一個(gè) Maven 項(xiàng)目 calculate-date-traps 并導(dǎo)入 Junit 依賴。

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

在進(jìn)行計(jì)費(fèi)時(shí)使用 Double 和 Float 類型計(jì)算經(jīng)常會(huì)出現(xiàn)丟失精度的情況,在 test 包下新建一個(gè)測(cè)試類 ScaleLostTest。

public class ScaleLostTest {

    @Test
    public void testDoubleLostScale(){
        double alpha = 1;
        double bravo = 20.2;
        double charlie = 400.03;
        System.out.println(alpha + bravo + charlie);
    }
}

執(zhí)行上述代碼,輸出結(jié)果如下 :

 使用 Double 類型進(jìn)行精確運(yùn)算出現(xiàn)了精度問(wèn)題。

代碼中所使用的這些數(shù)最終都會(huì)轉(zhuǎn)換成二進(jìn)制,而浮點(diǎn)類型的數(shù)轉(zhuǎn)換成二進(jìn)制并不是精確地二進(jìn)制,只能是最接近的二進(jìn)制,這是應(yīng)為浮點(diǎn)數(shù)是由指數(shù)和尾數(shù)兩部分組成,所以在浮點(diǎn)數(shù)計(jì)算的過(guò)程中會(huì)出現(xiàn)丟失精度的問(wèn)題。

如果恰巧計(jì)算結(jié)果的二進(jìn)制能和十進(jìn)制準(zhǔn)確轉(zhuǎn)換那么自然也就不會(huì)出現(xiàn)丟失精度的問(wèn)題了。浮點(diǎn)數(shù)并不適合進(jìn)行精確計(jì)算而更適合科學(xué)計(jì)算。而 BigDecimal 類型的核心就是精度,在 test 包下新建一個(gè)測(cè)試類 BigDecimalTest

public class BigDecimalTest {

    @Test
    public void testScaleException(){
        BigDecimal bigDecimal = new BigDecimal("12138.121");
        BigDecimal res = bigDecimal.setScale(2);
        System.out.println(res);
    }
}

執(zhí)行上述代碼,輸出結(jié)果如下: 

 設(shè)置的精度既小數(shù)點(diǎn)的位數(shù)比原來(lái)小會(huì)報(bào)錯(cuò)。設(shè)置為5,會(huì)自動(dòng)補(bǔ)上0,再次執(zhí)行測(cè)試輸出結(jié)果如下:

只想保留兩位數(shù)字,如何解決?如何對(duì)原始數(shù)字進(jìn)行舍入?BigDecimal支持的舍入方式有很多中,向上取整,向下取整,四舍五入等

@Test
public void testChangeScale(){
    BigDecimal bigDecimal = new BigDecimal("12138.121");
    BigDecimal res = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP);
    System.out.println(res);
}

12138.128 

測(cè)試其他舍入方式,除法運(yùn)算,除不盡出現(xiàn)異常問(wèn)題,除不盡,既無(wú)限循環(huán)的問(wèn)題

@Test
public void testDivideException(){
    BigDecimal d1 = new BigDecimal(10);
    BigDecimal d2 = new BigDecimal(3);
    System.out.println(d1.divide(d2));
}

@Test
public void testSolveDivideException(){
    BigDecimal d1 = new BigDecimal(10);
    BigDecimal d2 = new BigDecimal(3);
    System.out.println(d1.divide(d2, 2, BigDecimal.ROUND_HALF_UP));
}

指定精度和舍入方式

總結(jié):使用BigDecimal一定要指定保留小數(shù)點(diǎn)的位數(shù)和指定的舍入方式

精度問(wèn)題導(dǎo)致結(jié)果比較不一致:

@Test
public void testCompare(){
    BigDecimal d1 = new BigDecimal("0");
    BigDecimal d2 = new BigDecimal("0.0");

    System.out.println(d1.equals(d2));
    System.out.println(d1.compareTo(d2));
}

 equals()方法,精度不同直接返回false

到此這篇關(guān)于Java中BigDecimal,DateFormatter 和迭代器的"陷阱"的文章就介紹到這了,更多相關(guān)java 迭代器陷阱內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Dubbo之降級(jí)Mock源碼分析

    Dubbo之降級(jí)Mock源碼分析

    這篇文章主要為大家介紹了Dubbo降級(jí)Mock源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 源碼解讀Mybatis占位符#和$的區(qū)別

    源碼解讀Mybatis占位符#和$的區(qū)別

    這篇文章主要介紹了Mybatis占位符#和$的區(qū)別通過(guò)源碼解讀,針對(duì)筆者日常開(kāi)發(fā)中對(duì)?Mybatis?占位符?#{}?和?${}?使用時(shí)機(jī)結(jié)合源碼,思考總結(jié)而來(lái),需要的朋友可以參考下
    2023-02-02
  • C# log4net使用案例詳解

    C# log4net使用案例詳解

    這篇文章主要介紹了C# log4net使用案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • springboot+thymeleaf 文件上傳功能的實(shí)現(xiàn)代碼

    springboot+thymeleaf 文件上傳功能的實(shí)現(xiàn)代碼

    這篇文章主要介紹了springboot+thymeleaf 文件上傳功能的實(shí)現(xiàn)代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java微信支付之公眾號(hào)支付、掃碼支付實(shí)例

    Java微信支付之公眾號(hào)支付、掃碼支付實(shí)例

    微信支付已經(jīng)成為生活中必不可少的付款方式,本篇文章主要介紹了Java微信支付之公眾號(hào)支付、掃碼支付,有需要的小伙伴可以了解一下。
    2016-11-11
  • 在攔截器中讀取request參數(shù),解決在controller中無(wú)法二次讀取的問(wèn)題

    在攔截器中讀取request參數(shù),解決在controller中無(wú)法二次讀取的問(wèn)題

    這篇文章主要介紹了在攔截器中讀取request參數(shù),解決在controller中無(wú)法二次讀取的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • SpringCloud超詳細(xì)講解負(fù)載均衡組件Ribbon源碼

    SpringCloud超詳細(xì)講解負(fù)載均衡組件Ribbon源碼

    在微服務(wù)中,對(duì)服務(wù)進(jìn)行拆分之后,必然會(huì)帶來(lái)微服務(wù)之間的通信需求,而每個(gè)微服務(wù)為了保證高可用性,又會(huì)去部署集群,那么面對(duì)一個(gè)集群微服務(wù)進(jìn)行通信的時(shí)候,如何進(jìn)行負(fù)載均衡也是必然需要考慮的問(wèn)題
    2022-07-07
  • Java實(shí)戰(zhàn)之飛翔的小鳥(niǎo)小游戲

    Java實(shí)戰(zhàn)之飛翔的小鳥(niǎo)小游戲

    這篇文章主要介紹了Java實(shí)戰(zhàn)之飛翔的小鳥(niǎo)小游戲,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • 分享我的第一次java Selenium自動(dòng)化測(cè)試框架開(kāi)發(fā)過(guò)程

    分享我的第一次java Selenium自動(dòng)化測(cè)試框架開(kāi)發(fā)過(guò)程

    這篇文章主要介紹了分享我的第一次java Selenium自動(dòng)化測(cè)試框架開(kāi)發(fā)過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Java Builder Pattern建造者模式詳解及實(shí)例

    Java Builder Pattern建造者模式詳解及實(shí)例

    這篇文章主要介紹了Java Builder Pattern建造者模式詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-01-01

最新評(píng)論