第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

用JavaScript錯(cuò)誤地舍入大數(shù)

用JavaScript錯(cuò)誤地舍入大數(shù)

www說 2019-06-14 10:43:12
用JavaScript錯(cuò)誤地舍入大數(shù)請參閱以下代碼:<html>   <head>      <script src="http://www.json.org/json2.js" type="text/javascript"></script>     <script type="text/javascript">       var jsonString = '{"id":714341252076979033,"type":"FUZZY"}';       var jsonParsed = JSON.parse(jsonString);       console.log(jsonString, jsonParsed);     </script>   </head>   <body>   </body></html>當(dāng)我在Firefox 3.5中看到我的控制臺(tái)時(shí),jsonParsed的值是:Object id=714341252076979100 type=FUZZY即數(shù)字是四舍五入的。嘗試不同的值,結(jié)果相同(數(shù)字四舍五入)。我也不知道它的舍入規(guī)則。714341252076979136四舍五入為714341252076979200,而714341252076979135四舍五入為714341252076979100。編輯:見下面的第一個(gè)評(píng)論。顯然,這不是關(guān)于JSON的,而是關(guān)于JavaScript數(shù)字處理的。但問題仍然存在:為什么會(huì)發(fā)生這種事?
查看完整描述

3 回答

?
慕碼人8056858

TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超6個(gè)贊

你在這里看到的實(shí)際上是兩個(gè)圓的效果。ECMAScript中的數(shù)字在內(nèi)部表示為雙精度浮點(diǎn)。什么時(shí)候id設(shè)置為714341252076979033 (0x9e9d9958274c359在十六進(jìn)制中,它實(shí)際上被分配給最近可表示的雙精度值,即714341252076979072 (0x9e9d9958274c380)。當(dāng)打印出該值時(shí),它被舍入為15個(gè)有效小數(shù)位數(shù),這將給出14341252076979100.


查看完整回答
反對 回復(fù) 2019-06-14
?
慕絲7291255

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊

JavaScript的數(shù)字類型的容量超過了,請參見規(guī)范第8.5條關(guān)于細(xì)節(jié)。這些ID需要是字符串。

ieee-754雙精度浮點(diǎn)(JavaScript使用的那種數(shù)字)不能精確地表示。數(shù)字(當(dāng)然)。著名的是,0.1 + 0.2 == 0.3都是假的。這可以影響整數(shù),就像它影響小數(shù)一樣;當(dāng)你超過9,007,199,254,740,991時(shí),它就開始了(Number.MAX_SAFE_INTEGER).

超越Number.MAX_SAFE_INTEGER + 1 (9007199254740992),IEEE-754浮點(diǎn)格式不能再表示每個(gè)連續(xù)整數(shù)。9007199254740991 + 19007199254740992,但是9007199254740992 + 1 9007199254740992因?yàn)?/trans>9007199254740993無法以格式表示。下一個(gè)可以是9007199254740994..然后9007199254740995不可能,但是9007199254740996能,會(huì),可以。

原因是我們已經(jīng)沒有比特,所以我們不再有1s位;最低階位現(xiàn)在表示2的倍數(shù)。最后,如果我們繼續(xù)下去,我們就失去了這一點(diǎn),并且只在4的倍數(shù)中工作。諸若此類。

你的價(jià)值觀是超過這個(gè)閾值,它們被四舍五入到最近的可表示值。


如果你對比特感興趣,下面是發(fā)生的事情:ieee-754二進(jìn)制雙精度浮點(diǎn)數(shù)字有一個(gè)符號(hào)位,11位指數(shù)(它定義了該數(shù)字的總比例尺為2(因?yàn)檫@是一種二進(jìn)制格式),還有52位的重要意義(但這種格式非常聰明,從這52位中獲得了53位的精度)。如何使用指數(shù)很復(fù)雜(在此描述),但在非常模糊項(xiàng),如果我們在指數(shù)中加一個(gè),則意義的值是加倍的,因?yàn)橹笖?shù)用于2的冪(同樣,這里的警告,它不是直接的,那里有聰明)。

所以讓我們看看這個(gè)值9007199254740991(又名:Number.MAX_SAFE_INTEGER):

   +??????????????????????????????????????????????????????????????? sign bit
  / +???????+?????????????????????????????????????????????????????? exponent
 / /        |  +?????????????????????????????????????????????????+? significand
/ /         | /                                                  |
0 10000110011 1111111111111111111111111111111111111111111111111111
                = 9007199254740991 (Number.MAX_SAFE_INTEGER)

指數(shù)值,10000110011,這意味著,每次我們在意義上添加一個(gè),所表示的數(shù)字就會(huì)上升1(整個(gè)數(shù)字1,我們就失去了表示小數(shù)的能力)。

但現(xiàn)在意義已經(jīng)滿了。要超過這個(gè)數(shù)字,我們必須增加指數(shù),這意味著,如果我們在意義上加一個(gè),所表示的數(shù)字的值就會(huì)上升2,而不是1(因?yàn)橹笖?shù)被應(yīng)用于2,這個(gè)二進(jìn)制浮點(diǎn)數(shù)的基):

   +??????????????????????????????????????????????????????????????? sign bit
  / +???????+?????????????????????????????????????????????????????? exponent
 / /        |  +?????????????????????????????????????????????????+? significand
/ /         | /                                                  |
0 10000110100 0000000000000000000000000000000000000000000000000000
                = 9007199254740992 (Number.MAX_SAFE_INTEGER + 1)

好吧,沒關(guān)系,因?yàn)?/trans>9007199254740991 + 19007199254740992不管怎么說。但!我們不能代表9007199254740993..我們的零碎已經(jīng)用完了。如果我們僅將1添加到這個(gè)值中,它就會(huì)將2添加到以下值:

   +??????????????????????????????????????????????????????????????? sign bit
  / +???????+?????????????????????????????????????????????????????? exponent
 / /        |  +?????????????????????????????????????????????????+? significand
/ /         | /                                                  |
0 10000110100 0000000000000000000000000000000000000000000000000001
                = 9007199254740994 (Number.MAX_SAFE_INTEGER + 3)

這種格式不能再表示奇數(shù),因?yàn)槲覀冊黾恿藬?shù)值,指數(shù)太大了。

最后,我們又沒有意義位,必須增加指數(shù),所以我們只能表示4的倍數(shù)。然后是8的倍數(shù)。然后乘以16。諸若此類。


查看完整回答
反對 回復(fù) 2019-06-14
  • 3 回答
  • 0 關(guān)注
  • 300 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)