日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

lua 从一串数字中取出偶数位的数字_为什么JavaScript中 0.1 0.2 不等于0.3?

發(fā)布時間:2023/12/10 javascript 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 lua 从一串数字中取出偶数位的数字_为什么JavaScript中 0.1 0.2 不等于0.3? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

一、浮點數(shù)的二進制存儲

JavaScript遵循IEEE754標準,在64位中存儲一個數(shù)據(jù)的有效數(shù)字形式。

其中,第0位為符號位,0表示正數(shù)1表示負數(shù);第1到11位存儲指數(shù)部分;第12到63位存小數(shù)部分(尾數(shù)部分)(即有效數(shù)字)。由于二進制的有效數(shù)字總是表示為 1.xxx…的形式,尾數(shù)部分在規(guī)約形式下的第一位默認為1,故存儲時第一位省略不寫,尾數(shù)部分f存儲有效數(shù)字小數(shù)點后的xxx...,最長52位。因此,JavaScript提供的有效數(shù)字最長為53個二進制位(尾數(shù)部分52位+被省略的1位)。

以0.1、0.2、0.3、0.4和0.7的二進制形式為例:

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

對于52位之后進行舍入運算,此時可看作0舍1入(具體舍入規(guī)則在第三部分詳細說明),有精度損失。

二、對階運算

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

0.1+0.2->10.01100110011001100110011001100110011001100110011001110.3+0.4->10.1100110011001100110011001100110011001100110011001101

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

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對階階運算且規(guī)格化后的運算結(jié)果與0.7在二進制中的存儲尾數(shù)相同(可對照尾數(shù)后幾位),而0.1+0.2的運算結(jié)果與0.3的存儲尾數(shù)不同,且0.1+0.2轉(zhuǎn)化為十進制時結(jié)果為0.300000000000000004。
此時,雖然0.1+0.2與0.3+0.4進行舍入操作的近似位都為1,但一入一舍導(dǎo)致計算結(jié)果與“標準答案”的異同。

三、IEEE754標準下的舍入規(guī)則

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

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

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

四、總結(jié)思考

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

想了解跟多的基礎(chǔ)理念指南:

1、關(guān)注我,轉(zhuǎn)發(fā)+評論

2、私信發(fā)送:【電子書】,即可領(lǐng)取

總結(jié)

以上是生活随笔為你收集整理的lua 从一串数字中取出偶数位的数字_为什么JavaScript中 0.1 0.2 不等于0.3?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。