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

Java中浮點(diǎn)數(shù)精度問(wèn)題的解決方法

 更新時(shí)間:2016年10月01日 10:29:18   投稿:mrr  
這篇文章給大家介紹了Java中浮點(diǎn)數(shù)精度問(wèn)題的解決方法,本文給大家介紹的非常詳細(xì),有問(wèn)題描述有原因分析,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧

問(wèn)題描述

在項(xiàng)目中用Java做浮點(diǎn)數(shù)計(jì)算時(shí),發(fā)現(xiàn)對(duì)于4.015*100這樣的計(jì)算,結(jié)果不是預(yù)料中的401.5,而是401.49999999999994。如此長(zhǎng)的位數(shù),對(duì)于顯示來(lái)說(shuō)很不友好。

問(wèn)題原因:浮點(diǎn)數(shù)表示

查閱相關(guān)資料,發(fā)現(xiàn)原因是:計(jì)算機(jī)中的浮點(diǎn)數(shù)并不能完全精確表示。例如,對(duì)于一個(gè)double型的38414.4來(lái)說(shuō),計(jì)算機(jī)是這樣存儲(chǔ)它的:

轉(zhuǎn)成二進(jìn)制:1001011000001110.0110011001100110011001100110011001100
轉(zhuǎn)成科

學(xué)計(jì)數(shù)法:1.0010110000011100110011001100110011001100110011001100×2^15

double型編碼格式是這樣的:

double 符號(hào)位1位 階碼11位 尾數(shù)52位

符號(hào)位:正數(shù)統(tǒng)一是0

階碼:15是正數(shù),因此最高位是1,最低位減1,為10000001110

尾數(shù):去掉最高位默認(rèn)的1,為0010110000011100110011001100110011001100110011001100

組合起來(lái),最終得到的編碼是:0 10000001110 0010110000011100110011001100110011001100110011001100

從這里可以看出來(lái),主要原因在于二進(jìn)制編碼使得小數(shù)部分無(wú)法完全精確表示,例如0.4 = 0.25 + 0.125 + ...,只能無(wú)限接近。所以在對(duì)浮點(diǎn)數(shù)做計(jì)算時(shí)會(huì)產(chǎn)生精度誤差。

解決辦法:高精度

Java中的BigDecimal可以支持任意精度的浮點(diǎn)數(shù)運(yùn)算。在《Effective Java 》這本書(shū)中建議:float 和double 用來(lái)做科學(xué)計(jì)算或者是工程計(jì)算,而在商業(yè)計(jì)算中使用java.math.BigDecimal 。

BigDecimal有多種構(gòu)造方法,如BigDecimal(double),BigDecimal(String),需要注意的是:構(gòu)造參數(shù)為String類(lèi)型時(shí)才能保證不丟失精度,因?yàn)閐ouble類(lèi)型本身就是不完全精確的。故需要寫(xiě)成這樣:BigDecimal("0.02")。

double類(lèi)型的基本運(yùn)算都能在BigDecimal中找到相對(duì)應(yīng)的方法。另外,BigDecimal還可以配合NumberFormat做格式化輸出。

BigDecimal在做運(yùn)算的時(shí)候都會(huì)生成新的BigDecimal對(duì)象,因此相對(duì)double來(lái)說(shuō)會(huì)帶來(lái)更多的性能開(kāi)銷(xiāo)。

高精度實(shí)現(xiàn)初探

那么BigDecimal是如何做到能夠表示任意精度的呢?這里只做一個(gè)初步的分析。

首先看BigInteger的實(shí)現(xiàn)。普通的int型是32位,因此有范圍限制。BigInteger中有成員變量int[] mag,這樣變長(zhǎng)的int數(shù)組使得表示任意大小的整數(shù)成為可能。

再看BigDecimal的實(shí)現(xiàn)。它的官方介紹中說(shuō),任意一個(gè)BigDecimal都可以表示為unscaledValue × 10^-scale的形式。unscaledValue是一個(gè)任意大小的整數(shù),在源代碼中對(duì)應(yīng)BigInteger intVal這個(gè)成員變量;scale是階數(shù),在源代碼中對(duì)應(yīng)int scale這個(gè)變量。這樣就在BigInteger的基礎(chǔ)上得到了BigDecimal的實(shí)現(xiàn)。

以上所述是小編給大家介紹的Java中浮點(diǎn)數(shù)精度問(wèn)題的解決方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言。

相關(guān)文章

  • 淺談Spring中如何使用設(shè)計(jì)模式

    淺談Spring中如何使用設(shè)計(jì)模式

    這篇文章主要介紹了淺談Spring中如何使用設(shè)計(jì)模式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 對(duì)dbunit進(jìn)行mybatis DAO層Excel單元測(cè)試(必看篇)

    對(duì)dbunit進(jìn)行mybatis DAO層Excel單元測(cè)試(必看篇)

    下面小編就為大家?guī)?lái)一篇對(duì)dbunit進(jìn)行mybatis DAO層Excel單元測(cè)試(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • springBoot基于webSocket實(shí)現(xiàn)掃碼登錄

    springBoot基于webSocket實(shí)現(xiàn)掃碼登錄

    最近做了個(gè)新項(xiàng)目,涉及到掃碼登錄。之前項(xiàng)目使用的是 ajax輪詢(xún)的方式。感覺(jué)太low了。所以這次用webSocket的方式進(jìn)行實(shí)現(xiàn),感興趣的可以了解一下
    2021-06-06
  • java將一個(gè)目錄下的所有文件復(fù)制n次

    java將一個(gè)目錄下的所有文件復(fù)制n次

    這篇文章主要為大家詳細(xì)介紹了java將一個(gè)目錄下的所有文件復(fù)制n次,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • maven 打包時(shí)間戳問(wèn)題

    maven 打包時(shí)間戳問(wèn)題

    這篇文章主要介紹了maven 打包時(shí)間戳問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • zuulGateway 通過(guò)filter統(tǒng)一修改返回值的操作

    zuulGateway 通過(guò)filter統(tǒng)一修改返回值的操作

    這篇文章主要介紹了zuulGateway 通過(guò)filter統(tǒng)一修改返回值的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • 一篇文章帶你了解JAVA面對(duì)對(duì)象應(yīng)用

    一篇文章帶你了解JAVA面對(duì)對(duì)象應(yīng)用

    Java是一門(mén)面向?qū)ο蟮恼Z(yǔ)言。對(duì)象是Java程序中的基本實(shí)體。除了對(duì)象之外Java程序同樣處理基本數(shù)據(jù)。下面這篇文章主要給大家總結(jié)了關(guān)于Java中面向?qū)ο蟮闹R(shí)點(diǎn),需要的朋友可以參考借鑒,下面來(lái)一起看看吧
    2021-08-08
  • java集合List快速實(shí)現(xiàn)重復(fù)判斷的方法小結(jié)

    java集合List快速實(shí)現(xiàn)重復(fù)判斷的方法小結(jié)

    在java編寫(xiě)代碼中經(jīng)常會(huì)遇到某些重復(fù)判定或者去重的操作,本文主要為大家介紹了幾個(gè)常用方法,感興趣的小伙伴可以跟隨不想一起學(xué)習(xí)一下
    2024-12-12
  • Java連接WebSocket的實(shí)現(xiàn)教程

    Java連接WebSocket的實(shí)現(xiàn)教程

    這篇文章主要介紹了Java連接WebSocket的實(shí)現(xiàn)教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 深度分析java dump文件

    深度分析java dump文件

    java內(nèi)存dump是jvm運(yùn)行時(shí)內(nèi)存的一份快照,利用它可以分析是否存在內(nèi)存浪費(fèi),可以檢查內(nèi)存管理是否合理,當(dāng)發(fā)生OOM的時(shí)候,可以找出問(wèn)題的原因。那么dump文件的內(nèi)容是什么樣的呢?
    2021-05-05

最新評(píng)論

金昌市| 西平县| 马鞍山市| 陈巴尔虎旗| 佛学| 沙雅县| 乐都县| 沙雅县| 凌云县| 鄂州市| 静安区| 富源县| 布拖县| 长兴县| 宁陕县| 遂川县| 民和| 桂阳县| 蒙阴县| 广宗县| 兴和县| 于都县| 孟津县| 英德市| 盐津县| 略阳县| 荥经县| 夏津县| 石棉县| 浮梁县| 嘉祥县| 漳平市| 柳江县| 军事| 庆云县| 宜君县| 永平县| 项城市| 高淳县| 永城市| 通渭县|