摘要:返回是,這是為什么呢我們知道浮點(diǎn)數(shù)計(jì)算是不精確的,上面的返回式實(shí)際上是這樣的在的新規(guī)范加入了一個(gè)新的東西是在對(duì)象上面,新增一個(gè)極小的常量。根據(jù)規(guī)格,它表示與大于的最小浮點(diǎn)數(shù)之間的差。上面的代碼為浮點(diǎn)數(shù)運(yùn)算,部署了一個(gè)誤差檢查函數(shù)。
0.1+0.2 === 0.3 //返回是false, 這是為什么呢??
我們知道浮點(diǎn)數(shù)計(jì)算是不精確的,上面的返回式實(shí)際上是這樣的:
0.1 + 0.2 = 0.30000000000000004
0.1 + 0.2 - 0.3 = 5.551115123125783e-17
5.551115123125783e-17.toFixed(20) = "0.00000000000000005551"
在JavaScript的新規(guī)范ES6加入了一個(gè)新的東西-->Number.EPSILONNumber.EPSILON是在Number對(duì)象上面,新增一個(gè)極小的常量。根據(jù)規(guī)格,它表示 1 與大于 1 的最小浮點(diǎn)數(shù)之間的差。
對(duì)于 64 位浮點(diǎn)數(shù)(double)來(lái)說(shuō),大于 1 的最小浮點(diǎn)數(shù)相當(dāng)于二進(jìn)制的 1.00..001 ,小數(shù)點(diǎn)后面有連續(xù) 51 個(gè)零。這個(gè)值減去 1 之后,就等于 2 的-52 次方。
Number.EPSILON 實(shí)際上是 JavaScript 能夠表示的最小精度。誤差如果小于這個(gè)值,就可以認(rèn)為已經(jīng)沒(méi)有意義了,即不存在誤差了。
引入一個(gè)這么小的量的目的,在于為浮點(diǎn)數(shù)計(jì)算,設(shè)置一個(gè)誤差范圍。
好了,我們來(lái)解決上面的浮點(diǎn)數(shù)計(jì)算的問(wèn)題:Number.EPSILON 可以用來(lái)設(shè)置“能夠接受的誤差范圍”。比如,誤差范圍設(shè)為 2 的-50 次方(即 Number.EPSILON * Math.pow(2, 2) ),即如果兩個(gè)浮點(diǎn)數(shù)的差小于這個(gè)值,我們就認(rèn)為這兩個(gè)浮點(diǎn)數(shù)相等。
5.551115123125783e-17 < Number.EPSILON * Math.pow(2, 2) // true
因此, Number.EPSILON 的實(shí)質(zhì)是一個(gè)可以接受的最小誤差范圍。
function withinErrorMargin (left, right) { return Math.abs(left - right) < Number.EPSILON * Math.pow(2, 2); }
0.1 + 0.2 === 0.3 // false
withinErrorMargin(0.1 + 0.2, 0.3) // true
1.1 + 1.3 === 2.4 // false
withinErrorMargin(1.1 + 1.3, 2.4) // true
上面的代碼為浮點(diǎn)數(shù)運(yùn)算,部署了一個(gè)誤差檢查函數(shù)。
文章引用自ES6標(biāo)準(zhǔn)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/98934.html
摘要:按照的數(shù)字格式,整數(shù)有的范圍是,而且只能表示有限個(gè)浮點(diǎn)數(shù),能表示的個(gè)數(shù)為個(gè)。 0.1+0.2 等于0.3嗎?相信拿著這條題目隨便問(wèn)一個(gè)高年級(jí)的小學(xué)生,他們都會(huì)毫不猶豫都回答:相等。是的,相等是正常的,這是常識(shí)。但是都說(shuō)實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn),拿這道簡(jiǎn)單的算術(shù)題用javascript在chrome控制臺(tái)試驗(yàn)一下: 結(jié)果令人大跌眼鏡,在控制臺(tái)輸入0.1+0.2 == 0.3返回的結(jié)果竟然...
摘要:因此利用以及語(yǔ)法樹在代碼構(gòu)建過(guò)程中重寫等符號(hào),開(kāi)發(fā)時(shí)直接以這樣的形式編寫代碼,在構(gòu)建過(guò)程中編譯成,從而在開(kāi)發(fā)人員無(wú)感知的情況下解決計(jì)算失精的問(wèn)題,提升代碼的可讀性。 前言 你了解過(guò)0.1+0.2到底等于多少嗎?那0.1+0.7,0.8-0.2呢? 類似于這種問(wèn)題現(xiàn)在已經(jīng)有了很多的解決方案,無(wú)論引入外部庫(kù)或者是自己定義計(jì)算函數(shù)最終的目的都是利用函數(shù)去代替計(jì)算。例如一個(gè)漲跌幅百分比的一個(gè)...
摘要:由于浮點(diǎn)數(shù)不是精確的值,所以涉及小數(shù)的比較和運(yùn)算要特別小心。根據(jù)標(biāo)準(zhǔn),位浮點(diǎn)數(shù)的指數(shù)部分的長(zhǎng)度是個(gè)二進(jìn)制位,意味著指數(shù)部分的最大值是的次方減。也就是說(shuō),位浮點(diǎn)數(shù)的指數(shù)部分的值最大為。 一 前言 這篇文章主要解決以下三個(gè)問(wèn)題: 問(wèn)題1:浮點(diǎn)數(shù)計(jì)算精確度的問(wèn)題 0.1 + 0.2; //0.30000000000000004 0.1 + 0.2 === 0.3; // ...
摘要:本文通過(guò)介紹的二進(jìn)制存儲(chǔ)標(biāo)準(zhǔn)來(lái)理解浮點(diǎn)數(shù)運(yùn)算精度問(wèn)題,和理解對(duì)象的等屬性值是如何取值的,最后介紹了一些常用的浮點(diǎn)數(shù)精度運(yùn)算解決方案。浮點(diǎn)數(shù)精度運(yùn)算解決方案關(guān)于浮點(diǎn)數(shù)運(yùn)算精度丟失的問(wèn)題,不同場(chǎng)景可以有不同的解決方案。 本文由云+社區(qū)發(fā)表 相信大家在平常的 JavaScript 開(kāi)發(fā)中,都有遇到過(guò)浮點(diǎn)數(shù)運(yùn)算精度誤差的問(wèn)題,比如 console.log(0.1+0.2===0.3)// fa...
閱讀 2009·2021-09-30 09:53
閱讀 1852·2021-09-24 09:48
閱讀 1762·2019-08-30 14:01
閱讀 2174·2019-08-29 18:35
閱讀 1255·2019-08-26 18:27
閱讀 2985·2019-08-26 12:12
閱讀 950·2019-08-23 17:16
閱讀 943·2019-08-23 15:31