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

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

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

前言:

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

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

在進行計費時使用 Double 和 Float 類型計算經(jīng)常會出現(xiàn)丟失精度的情況,在 test 包下新建一個測試類 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 類型進行精確運算出現(xiàn)了精度問題。

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

如果恰巧計算結(jié)果的二進制能和十進制準(zhǔn)確轉(zhuǎn)換那么自然也就不會出現(xiàn)丟失精度的問題了。浮點數(shù)并不適合進行精確計算而更適合科學(xué)計算。而 BigDecimal 類型的核心就是精度,在 test 包下新建一個測試類 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ù)點的位數(shù)比原來小會報錯。設(shè)置為5,會自動補上0,再次執(zhí)行測試輸出結(jié)果如下:

只想保留兩位數(shù)字,如何解決?如何對原始數(shù)字進行舍入?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 

測試其他舍入方式,除法運算,除不盡出現(xiàn)異常問題,除不盡,既無限循環(huá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ù)點的位數(shù)和指定的舍入方式

精度問題導(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解java實現(xiàn)簡單掃碼登錄功能(模仿微信網(wǎng)頁版掃碼)

    詳解java實現(xiàn)簡單掃碼登錄功能(模仿微信網(wǎng)頁版掃碼)

    這篇文章主要介紹了java實現(xiàn)簡單掃碼登錄功能(模仿微信網(wǎng)頁版掃碼),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Java spring webmvc如何實現(xiàn)控制反轉(zhuǎn)

    Java spring webmvc如何實現(xiàn)控制反轉(zhuǎn)

    這篇文章主要介紹了Java spring webmvc如何實現(xiàn)控制反轉(zhuǎn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • Spring?AOP操作的相關(guān)術(shù)語及環(huán)境準(zhǔn)備

    Spring?AOP操作的相關(guān)術(shù)語及環(huán)境準(zhǔn)備

    這篇文章主要為大家介紹了Spring?AOP操作的相關(guān)術(shù)語及環(huán)境準(zhǔn)備學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • 學(xué)習(xí)Java設(shè)計模式之觀察者模式

    學(xué)習(xí)Java設(shè)計模式之觀察者模式

    這篇文章主要為大家介紹了Java設(shè)計模式中的觀察者模式,對Java設(shè)計模式感興趣的小伙伴們可以參考一下
    2016-01-01
  • 詳解Java的堆內(nèi)存與棧內(nèi)存的存儲機制

    詳解Java的堆內(nèi)存與棧內(nèi)存的存儲機制

    這篇文章主要介紹了Java的堆內(nèi)存與棧內(nèi)存的存儲機制,包括JVM的內(nèi)存優(yōu)化和GC等相關(guān)方面內(nèi)容,需要的朋友可以參考下
    2016-01-01
  • java中volatile關(guān)鍵字的作用詳解

    java中volatile關(guān)鍵字的作用詳解

    這篇文章主要介紹了java中volatile關(guān)鍵字的作用詳解,volatile可以保證,若一個線程改變了某塊內(nèi)存的值,其他線程是可見的,以至于其他線程能及時更新這塊內(nèi)存,需要的朋友可以參考下
    2023-09-09
  • 最新評論

    南皮县| 云和县| 富宁县| 朝阳区| 东乌珠穆沁旗| 黄平县| 英德市| 东平县| 莎车县| 犍为县| 铜鼓县| 海城市| 蒲城县| 商水县| 永川市| 潍坊市| 抚宁县| 罗江县| 绥芬河市| 枣强县| 道孚县| 武义县| 措美县| 新安县| 伽师县| 绥芬河市| 文山县| 乐安县| 连南| 镇雄县| 嫩江县| 泾川县| 乐都县| 鄂托克前旗| 兰州市| 通榆县| 辰溪县| 长泰县| 五华县| 三原县| 博湖县|