成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript四舍五入的那些坑

zollero / 3598人閱讀

摘要:進(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

相關(guān)文章

  • javascript高級程序設(shè)計(jì)》筆記:Number類型

    摘要:用表示法表示的數(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 ...

    Tychio 評論0 收藏0
  • jQuery 3.0 beta 發(fā)布

    摘要:回調(diào)函數(shù)將固定為異步執(zhí)行。這些將被移除這些應(yīng)該會保留需要注意的是,那些繼續(xù)存在的回調(diào)函數(shù)不會有任何變化,只有的方法會受影響。 創(chuàng)作不夠,譯文來湊。 跟上篇一樣是編譯,不準(zhǔn)備逐字翻。比如,我會把we譯成jQuery官方團(tuán)隊(duì),或者他們。 初譯版,待校正。這篇文章比較長,翻譯難度也不小,如果有問題,歡迎提出,我盡量修改。 正文開始。 歪果仁也要雙喜臨門,于是 jQuery 官方團(tuán)隊(duì)選在 j...

    LeanCloud 評論0 收藏0
  • CSS外掛:Sass那些裝逼函數(shù)(function)

    摘要:,返回的最大值。非相同的單位,報(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ù)...

    booster 評論0 收藏0
  • Javascript 簡介

    摘要:在中,標(biāo)識符常用于定義變量名和函數(shù)名等。復(fù)雜的表達(dá)式由簡單表達(dá)式和運(yùn)算符組成。布爾類型只有兩個(gè)值真和假。表示一個(gè)空的對象。操作符檢測會返回。是派生自的,因此規(guī)定對它們的相等性測試返回表示值相等。 Javascript 簡介 JavaScript是一種運(yùn)行在瀏覽器中的解釋型的編程語言:將文本格式的字符代碼發(fā)送給瀏覽器由瀏覽器解釋運(yùn)行。 JavaScript組成 核心(ECMAScrip...

    duan199226 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<