摘要:進(jìn)制之謎眾所周知,計(jì)算機(jī)在設(shè)計(jì)之初,出于各方面角度考慮,最終采用二進(jìn)制的格式來存儲數(shù)據(jù)。同樣的情況,也會出現(xiàn)在十進(jìn)制和二進(jìn)制的轉(zhuǎn)換中。當(dāng)我們在計(jì)算機(jī)中,聲明一個(gè)變量為,其實(shí)該數(shù)字作為二進(jìn)制保存在計(jì)算機(jī)中,并不真的是。
前言
經(jīng)常使用JavaScript用來處理數(shù)字的程序員都知道,JavaScript的Number.toFixed,這一函數(shù),在格式化數(shù)字時(shí),會自動(dòng)進(jìn)行四舍五入,例如:
10.125.toFixed(2) ---> "10.13"
但是在某些情況下,其四舍五入的結(jié)果,往往都不盡人意,例如:
10.145.toFixed(2) ---> "10.14"
那為何為出現(xiàn)上述這種情況,需要從進(jìn)制談起。
進(jìn)制之謎眾所周知,計(jì)算機(jī)在設(shè)計(jì)之初,出于各方面角度考慮,最終采用二進(jìn)制的格式來存儲數(shù)據(jù)。而我們平時(shí)對于數(shù)字所慣用的進(jìn)制是十進(jìn)制。用二進(jìn)制的格式來存儲十進(jìn)制的數(shù)據(jù),必然會面臨進(jìn)制的轉(zhuǎn)換,進(jìn)制的轉(zhuǎn)換就會面臨精度的丟失。
例如,對于?,對于三進(jìn)制的數(shù)來說是0.1,而對于十進(jìn)制來說,是0.333(3循環(huán))。那對于三個(gè)?相加,對于三進(jìn)制來說,就是一(逢三進(jìn)一),而對于十進(jìn)制來說,就是0.999(9循環(huán))。
同樣的情況,也會出現(xiàn)在十進(jìn)制和二進(jìn)制的轉(zhuǎn)換中。當(dāng)我們在計(jì)算機(jī)中,聲明一個(gè)變量為10.145,其實(shí)該數(shù)字作為二進(jìn)制保存在計(jì)算機(jī)中,并不真的是10.145??梢酝ㄟ^Number.prototype.toPrecision方法來一探究竟。
Number.prototype.toPrecision方法以指定的精度返回該數(shù)值對象的字符串表示。
10.145.toPrecision(21) --->?"10.1449999999999995737"
因此就可以解釋,為什么toFixed()方法返回的四舍五入的值,在某些情況不符合預(yù)料。
同樣,也告訴大家,浮點(diǎn)數(shù)的所有計(jì)算,加減乘除無一例外,在某些情況下,都會出現(xiàn)不符合預(yù)料的情況,最常見的如0.1+0.2,等等。
解決方案針對上述情況,我寫了一個(gè)簡單的庫,可以滿足數(shù)字的四舍五入需求。round-js
探索浮點(diǎn)數(shù)標(biāo)準(zhǔn)和大部分語言不同,JavaScript目前對于數(shù)字的表示,只有一種類型,即Number,采用64位雙精度浮點(diǎn)數(shù)來表示一個(gè)數(shù),其標(biāo)準(zhǔn)與大多數(shù)語言一樣,采用IEEE-754標(biāo)準(zhǔn)。IEEE-754下64位雙精度浮點(diǎn)數(shù)的標(biāo)準(zhǔn),可以用一張圖來表示,如下:
sign:代表符號,用1位來表示,即正數(shù)負(fù)數(shù),1代表正數(shù),0代表負(fù)數(shù);
exponent:代表指數(shù),底數(shù)為2,用11位來表述;
fraction:真正的有效數(shù)字,用52位來表示。
最終,任何一個(gè)數(shù),對于該標(biāo)準(zhǔn),都使用如下公式來表示得出:
其中:
V:結(jié)果
S:上面的sign
M:有效數(shù)字fraction
E:上面的exponent
可以看出,這個(gè)表示方法,類似十進(jìn)制中的科學(xué)計(jì)數(shù)法。
對于這些概念,IEEE-754標(biāo)準(zhǔn)中還有許多規(guī)定,例如<1M<2,等等,更多細(xì)節(jié)就不展開了。
完。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/89620.html
摘要:用表示法表示的數(shù)值等于前面的數(shù)值乘以的指數(shù)次冪。下面是一個(gè)使用表示法表示數(shù)值的例子等于注意浮點(diǎn)類型精度控制的兩個(gè)方法是原型上實(shí)現(xiàn)的一個(gè)方法,其作用是對一個(gè)浮點(diǎn)數(shù)進(jìn)行四舍五入并保留固定小數(shù)位。 進(jìn)制表示 談到Number類型,不得不提進(jìn)制(此處不做過多介紹)八進(jìn)制字面值的第一位必須是零(0),然后是八進(jìn)制數(shù)字序列(0~7)十六進(jìn)制字面值的前兩位必須是 0x,后跟任何十六進(jìn)制數(shù)字(0~9 ...
摘要:回調(diào)函數(shù)將固定為異步執(zhí)行。這些將被移除這些應(yīng)該會保留需要注意的是,那些繼續(xù)存在的回調(diào)函數(shù)不會有任何變化,只有的方法會受影響。 創(chuàng)作不夠,譯文來湊。 跟上篇一樣是編譯,不準(zhǔn)備逐字翻。比如,我會把we譯成jQuery官方團(tuán)隊(duì),或者他們。 初譯版,待校正。這篇文章比較長,翻譯難度也不小,如果有問題,歡迎提出,我盡量修改。 正文開始。 歪果仁也要雙喜臨門,于是 jQuery 官方團(tuán)隊(duì)選在 j...
摘要:,返回的最大值。非相同的單位,報(bào)錯(cuò)編譯為,返回一個(gè)隨機(jī)數(shù)。函數(shù)函數(shù)稱為三元條件函數(shù),主要因?yàn)樗椭械娜袛喾浅5南嗨啤n伾瘮?shù)暫時(shí)還沒用到過。函數(shù),根據(jù)三個(gè)值創(chuàng)建一個(gè)顏色將一個(gè)顏色根據(jù)透明度轉(zhuǎn)換成顏色。 前戲:前幾篇文章其實(shí)都是些基礎(chǔ)必備的,什么變量、繼承、占位符、混合宏...這回來高級點(diǎn)的,玩玩Sass 自帶的一些函數(shù)...有字符串函數(shù)(String Functions)、數(shù)字函數(shù)...
摘要:在中,標(biāo)識符常用于定義變量名和函數(shù)名等。復(fù)雜的表達(dá)式由簡單表達(dá)式和運(yùn)算符組成。布爾類型只有兩個(gè)值真和假。表示一個(gè)空的對象。操作符檢測會返回。是派生自的,因此規(guī)定對它們的相等性測試返回表示值相等。 Javascript 簡介 JavaScript是一種運(yùn)行在瀏覽器中的解釋型的編程語言:將文本格式的字符代碼發(fā)送給瀏覽器由瀏覽器解釋運(yùn)行。 JavaScript組成 核心(ECMAScrip...
閱讀 1479·2023-04-26 00:08
閱讀 818·2021-11-23 18:51
閱讀 1690·2021-11-12 10:34
閱讀 1023·2021-10-14 09:43
閱讀 512·2021-08-18 10:23
閱讀 2594·2019-08-30 15:55
閱讀 3402·2019-08-30 11:05
閱讀 2802·2019-08-29 12:50