真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

為什么JavaScript中0.1+0.2不等于0.3?-創(chuàng)新互聯(lián)

本文首發(fā)于 vivo互聯(lián)網(wǎng)技×××鏈接:https://mp.weixin.qq.com/s/2kea7-jACCJmSYBQAwXyIg
作者:劉洋

在龍圩等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站建設(shè),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),營(yíng)銷型網(wǎng)站,外貿(mào)網(wǎng)站制作,龍圩網(wǎng)站建設(shè)費(fèi)用合理。

在 js 中進(jìn)行數(shù)學(xué)的運(yùn)算時(shí),會(huì)出現(xiàn)0.1+0.2=0.300000000000000004的結(jié)果,一開(kāi)始認(rèn)為是浮點(diǎn)數(shù)的二進(jìn)制存儲(chǔ)導(dǎo)致的精度問(wèn)題,但這似乎不能很好的解釋為什么在同樣的存儲(chǔ)方式下0.3+0.4=0.7可以得到正確的結(jié)果。本文主要通過(guò)浮點(diǎn)數(shù)的二進(jìn)制存儲(chǔ)及運(yùn)算,和IEEE754下的舍入規(guī)則,解釋為何會(huì)出現(xiàn)這種情況。

一、浮點(diǎn)數(shù)的二進(jìn)制存儲(chǔ)

JavaScript遵循IEEE754標(biāo)準(zhǔn),在64位中存儲(chǔ)一個(gè)數(shù)據(jù)的有效數(shù)字形式。

為什么 JavaScript 中 0.1+0.2 不等于 0.3 ?

其中,第0位為符號(hào)位,0表示正數(shù)1表示負(fù)數(shù);第1到11位存儲(chǔ)指數(shù)部分;第12到63位存小數(shù)部分(尾數(shù)部分)(即有效數(shù)字)。由于二進(jìn)制的有效數(shù)字總是表示為 1.xxx…的形式,尾數(shù)部分在規(guī)約形式下的第一位默認(rèn)為1,故存儲(chǔ)時(shí)第一位省略不寫,尾數(shù)部分f存儲(chǔ)有效數(shù)字小數(shù)點(diǎn)后的xxx...,最長(zhǎng)52位。因此,JavaScript提供的有效數(shù)字最長(zhǎng)為53個(gè)二進(jìn)制位(尾數(shù)部分52位+被省略的1位)。
以0.1、0.2、0.3、0.4和0.7的二進(jìn)制形式為例:

0.1->0.0001100110011...(0011無(wú)限循環(huán))->0-01111111011-(1 .)1001100110011001100110011001100110011001100110011010(入)
0.2->0.001100110011...(0011無(wú)限循環(huán))->0-01111111100-(1 .)1001100110011001100110011001100110011001100110011010(入)
0.3->0.01001100110011...(0011無(wú)限循環(huán))->0-01111111101-(1 .)0011001100110011001100110011001100110011001100110011(舍)
0.4->0.01100110011...(0011無(wú)限循環(huán))->0-01111111101-(1 .)1001100110011001100110011001100110011001100110011010(入)
0.7->0.101100110011...(0011無(wú)限循環(huán))->0-01111111110-(1 .)0110011001100110011001100110011001100110011001100110(舍)

對(duì)于52位之后進(jìn)行舍入運(yùn)算,此時(shí)可看作0舍1入(具體舍入規(guī)則在第三部分詳細(xì)說(shuō)明),有精度損失。

二、對(duì)階運(yùn)算

由于指數(shù)位數(shù)不同,運(yùn)算時(shí)需要進(jìn)行對(duì)階運(yùn)算。對(duì)階過(guò)程略,0.1+0.2與0.3+0.4的尾數(shù)求和結(jié)果分別如下:

0.1+0.2->10.0110011001100110011001100110011001100110011001100111
0.3+0.4->10.1100110011001100110011001100110011001100110011001101

求和結(jié)果需規(guī)格化(有效數(shù)字表示),右規(guī)導(dǎo)致低位丟失,此時(shí)需對(duì)丟失的低位進(jìn)行舍入操作:

0.1+0.2->1.00110011001100110011001100110011001100110011001100111->1.0011001100110011001100110011001100110011001100110100(入)
0.3+0.4->1.01100110011001100110011001100110011001100110011001101->1.0110011001100110011001100110011001100110011001100110(舍)

即:
00111->0100
01101->0110

此處同樣有精度損失。在這里我們可以發(fā)現(xiàn),0.3+0.4對(duì)階階運(yùn)算且規(guī)格化后的運(yùn)算結(jié)果與0.7在二進(jìn)制中的存儲(chǔ)尾數(shù)相同(可對(duì)照尾數(shù)后幾位),而0.1+0.2的運(yùn)算結(jié)果與0.3的存儲(chǔ)尾數(shù)不同,且0.1+0.2轉(zhuǎn)化為十進(jìn)制時(shí)結(jié)果為0.300000000000000004。
此時(shí),雖然0.1+0.2與0.3+0.4進(jìn)行舍入操作的近似位都為1,但一入一舍導(dǎo)致計(jì)算結(jié)果與“標(biāo)準(zhǔn)答案”的異同。

三、IEEE754標(biāo)準(zhǔn)下的舍入規(guī)則

維基百科對(duì)最近偶數(shù)舍入原則的解釋如下:舍入到最接近,在一樣接近的情況下偶數(shù)優(yōu)先(Ties To Even,這是默認(rèn)的舍入方式),即會(huì)將結(jié)果舍入為最接近(精度損失最小)且可以表示的值,但是當(dāng)存在兩個(gè)數(shù)一樣接近的時(shí)候,則取其中的偶數(shù)(在二進(jìn)制中是以0結(jié)尾的)。

首先要注意的是,保留小數(shù)不是只看后面一位或者兩位,而是看保留位后面的所有位。

為什么 JavaScript 中 0.1+0.2 不等于 0.3 ?

如圖,可以看到近似需要看三位,保留位(近似后的最低位)、近似位(保留位的后一位)、粘滯位(sticky bit 近似位后的所有位進(jìn)行或運(yùn)算后看作一位)。
當(dāng)粘滯位為1時(shí),舍入規(guī)則可以看作0舍1入,近似位為0舍,近似位為1入(即第一部分小數(shù)二進(jìn)制存儲(chǔ)為52位尾數(shù)時(shí)所進(jìn)行的舍入操作)。
當(dāng)粘滯位為0時(shí),若近似位為0則舍去。
當(dāng)粘滯位為0時(shí),若近似位為1,無(wú)論舍入精度損失都相同,故需取舍入兩種結(jié)果中的偶數(shù):保留位為1時(shí)入,保留位為0時(shí)舍(即第二部分對(duì)階運(yùn)算規(guī)格化時(shí)的舍入操作)。

四、總結(jié)思考

由于IEEE754標(biāo)準(zhǔn),這樣的“bug”不止在JavaScript中會(huì)出現(xiàn),在所有采用該標(biāo)準(zhǔn)的語(yǔ)言中都會(huì)存在,實(shí)際編程中可以通過(guò)設(shè)置精度保留位數(shù)等方式解決。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


本文標(biāo)題:為什么JavaScript中0.1+0.2不等于0.3?-創(chuàng)新互聯(lián)
新聞來(lái)源:http://weahome.cn/article/dhoipi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部