成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

如何解決0.1 +0.2===0.30000000000000004類(lèi)問(wèn)題

yuanzhanghu / 1245人閱讀

摘要:方法使用定點(diǎn)表示法來(lái)格式化一個(gè)數(shù),會(huì)對(duì)結(jié)果進(jìn)行四舍五入。該數(shù)值在必要時(shí)進(jìn)行四舍五入,另外在必要時(shí)會(huì)用來(lái)填充小數(shù)部分,以便小數(shù)部分有指定的位數(shù)。如果數(shù)值大于,該方法會(huì)簡(jiǎn)單調(diào)用并返回一個(gè)指數(shù)記數(shù)法格式的字符串。在環(huán)境中,只能是之間,測(cè)試版本為。

上篇博客深度剖析了0.1+0.2 === 0.30000000000000004的原因。
這篇博客將主要提供幾種解決小數(shù)精度丟失問(wèn)題的Javascript類(lèi)庫(kù)的代碼示例,以及簡(jiǎn)單的原生EcmaScript方法的代碼示例。

一.類(lèi)庫(kù)部分 math.js

math.js是JavaScript和Node.js的一個(gè)廣泛的數(shù)學(xué)庫(kù)。支持?jǐn)?shù)字,大數(shù),復(fù)數(shù),分?jǐn)?shù),單位和矩陣等數(shù)據(jù)類(lèi)型的運(yùn)算。

官網(wǎng):http://mathjs.org/
GitHub:https://github.com/josdejong/mathjs

0.1+0.2 ===0.3實(shí)現(xiàn)代碼:

var math = require("mathjs")
console.log(math.add(0.1,0.2))//0.30000000000000004
console.log(math.format((math.add(math.bignumber(0.1),math.bignumber(0.2)))))//"0.3"
decimal.js

為 JavaScript 提供十進(jìn)制類(lèi)型的任意精度數(shù)值。

官網(wǎng):http://mikemcl.github.io/decimal.js/

GitHub:https://github.com/MikeMcl/decimal.js

var Decimal = require("decimal.js")
x = new  Decimal(0.1)
y = 0.2
console.log(x.plus(y).toString())//"0.3"
bignumber.js

用于任意精度算術(shù)的JavaScript庫(kù)。

官網(wǎng):http://mikemcl.github.io/bignumber.js/

Github:https://github.com/MikeMcl/bignumber.js

var BigNumber = require("bignumber.js")
x = new BigNumber(0.1)
y = 0.2
console.log(x.plus(y).toString())//"0.3"
big.js

用于任意精度十進(jìn)制算術(shù)的小型快速JavaScript庫(kù)。
官網(wǎng):http://mikemcl.github.io/big.js/
Github:https://github.com/MikeMcl/big.js/

var Big = require("big.js")
x = new Big(0.1)
y = 0.2
console.log(x.plus(y).toString())//"0.3"

有一個(gè)需要注意的點(diǎn),使用類(lèi)庫(kù)此時(shí)輸出的0.3是String類(lèi)型,因此若想保持為Number類(lèi)型,可使用parseFloat()方法。

還有一個(gè)注意點(diǎn),在本地install測(cè)試的時(shí)候,npm i mathjs -g ,require是也要require("mathjs"),而不是帶點(diǎn)的math.js,因?yàn)閖osdejong這哥們?cè)趧?chuàng)建項(xiàng)目的時(shí)候就命名為mathjs,而同時(shí)擁有上述decimal.js, bignumber.js和big.js的MikeMcl,項(xiàng)目名字就帶了dot,因此安裝和引入時(shí),都是xxx.js的形式。

如何在這三個(gè)類(lèi)庫(kù)之間做選擇,還需要大家自己根據(jù)具體情況具體分析,我在這里就不贅述了。

最后,教大家一個(gè)線上直接測(cè)試的網(wǎng)站,https://npm.runkit.com,子路徑輸入想要測(cè)試的Node.js package名,就可以實(shí)現(xiàn)在線測(cè)試包中的api了。
例如:
math.js:https://npm.runkit.com/mathjs
big.js:https://npm.runkit.com/big.js

二、原生方法

類(lèi)庫(kù)其實(shí)很強(qiáng)大,我們計(jì)算0.1+0.2其實(shí)只是用到了冰山一角,那么我們?nèi)绾问褂迷腅cmaScript代碼來(lái)應(yīng)用于簡(jiǎn)單的問(wèn)題場(chǎng)景呢?

這就要用到Number.prototype.toFixed()這個(gè)方法了。

浮點(diǎn)數(shù)運(yùn)算

toFixed() 方法

浮點(diǎn)數(shù)運(yùn)算的解決方案有很多,這里給出一種目前常用的解決方案, 在判斷浮點(diǎn)數(shù)運(yùn)算結(jié)果前對(duì)計(jì)算結(jié)果進(jìn)行精度縮小,因?yàn)樵诰瓤s小的過(guò)程總會(huì)自動(dòng)四舍五入。

toFixed() 方法使用定點(diǎn)表示法來(lái)格式化一個(gè)數(shù),會(huì)對(duì)結(jié)果進(jìn)行四舍五入。語(yǔ)法為:

JavaScript 代碼:
numObj.toFixed(digits)
參數(shù) digits 表示小數(shù)點(diǎn)后數(shù)字的個(gè)數(shù);介于 0 到 20 (包括)之間,實(shí)現(xiàn)環(huán)境可能支持更大范圍。如果忽略該參數(shù),則默認(rèn)為 0。

返回一個(gè)數(shù)值的字符串表現(xiàn)形式,不使用指數(shù)記數(shù)法,而是在小數(shù)點(diǎn)后有 digits 位數(shù)字。該數(shù)值在必要時(shí)進(jìn)行四舍五入,另外在必要時(shí)會(huì)用 0 來(lái)填充小數(shù)部分,以便小數(shù)部分有指定的位數(shù)。 如果數(shù)值大于 1e+21,該方法會(huì)簡(jiǎn)單調(diào)用 Number.prototype.toString()并返回一個(gè)指數(shù)記數(shù)法格式的字符串。

特別注意:toFixed() 返回一個(gè)數(shù)值的字符串表現(xiàn)形式。

具體可以查看 MDN中的說(shuō)明,那么我們可以這樣解決精度問(wèn)題:

JavaScript 代碼:

parseFloat((數(shù)學(xué)表達(dá)式).toFixed(digits)); // toFixed() 精度參數(shù)須在 0 與20 之間
// 運(yùn)行
parseFloat((0.1 + 0.2).toFixed(10))//結(jié)果為0.3
parseFloat((0.3 / 0.1).toFixed(10)) // 結(jié)果為 3  
parseFloat((0.7 * 180).toFixed(10))//結(jié)果為126
parseFloat((1.0 - 0.9).toFixed(10)) // 結(jié)果為 0.1   
parseFloat((9.7 * 100).toFixed(10)) // 結(jié)果為 970 
parseFloat((2.22 + 0.1).toFixed(10)) // 結(jié)果為 2.32

在Browser環(huán)境精度參數(shù)允許0~100位之間(包括100),測(cè)試版本為Chrome62(64位)和Firefox56 (32 位)。
在Nodejs環(huán)境中,只能是0~20之間,測(cè)試版本為v6.9.5。

其次就是toFixed()的瀏覽器兼容性討論,MDN給出的結(jié)果全部是YES,無(wú)論desktop端還是mobile端,也就是說(shuō)不用擔(dān)心toFixed()的兼容性問(wèn)題(ie8- 我們不做討論)。

desktop端:

mobile端:

Thanks:
http://www.css88.com/archives...
https://developer.mozilla.org...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/89610.html

相關(guān)文章

  • JS魔法堂:徹底理解0.1 + 0.2 === 0.30000000000000004的背后

    摘要:也就是說(shuō)不僅是會(huì)產(chǎn)生這種問(wèn)題,只要是采用的浮點(diǎn)數(shù)編碼方式來(lái)表示浮點(diǎn)數(shù)時(shí),則會(huì)產(chǎn)生這類(lèi)問(wèn)題。到這里我們都理解只要采取的浮點(diǎn)數(shù)編碼的語(yǔ)言均會(huì)出現(xiàn)上述問(wèn)題,只是它們的標(biāo)準(zhǔn)類(lèi)庫(kù)已經(jīng)為我們提供了解決方案而已。 Brief 一天有個(gè)朋友問(wèn)我JS中計(jì)算0.7 * 180怎么會(huì)等于125.99999999998,坑也太多了吧!那時(shí)我猜測(cè)是二進(jìn)制表示數(shù)值時(shí)發(fā)生round-off error所導(dǎo)致,但并不...

    JerryWangSAP 評(píng)論0 收藏0
  • 探尋 JavaScript 精度問(wèn)題以及解決方案

    摘要:推導(dǎo)為何等于在中所有數(shù)值都以標(biāo)準(zhǔn)的雙精度浮點(diǎn)數(shù)進(jìn)行存儲(chǔ)的。先來(lái)了解下標(biāo)準(zhǔn)下的雙精度浮點(diǎn)數(shù)。精度位總共是,因?yàn)橛每茖W(xué)計(jì)數(shù)法表示,所以首位固定的就沒(méi)有占用空間。驗(yàn)證完成的最大安全數(shù)是如何來(lái)的根據(jù)雙精度浮點(diǎn)數(shù)的構(gòu)成,精度位數(shù)是。 閱讀完本文可以了解到 0.1 + 0.2 為什么等于 0.30000000000000004 以及 JavaScript 中最大安全數(shù)是如何來(lái)的。 十進(jìn)制小數(shù)轉(zhuǎn)為二...

    YanceyOfficial 評(píng)論0 收藏0
  • JS中如何理解浮點(diǎn)數(shù)?

    摘要:本文通過(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...

    bang590 評(píng)論0 收藏0
  • 深度剖析0.1 +0.2===0.30000000000000004的原因

    摘要:吐槽一句,大二的專(zhuān)業(yè)課數(shù)字邏輯電路終于用在工作上了。,整數(shù)位為,且精度只到十分位,因此是。如果是不限精度的話,轉(zhuǎn)換后的二進(jìn)制數(shù)應(yīng)該是無(wú)限循環(huán)。再看一下百科給出的標(biāo)準(zhǔn)因此,的類(lèi)型,最高的位是符號(hào)位,接著的位是指數(shù),剩下的位為有效數(shù)字。 showImg(https://segmentfault.com/img/remote/1460000011902479?w=600&h=600); 用一...

    haobowd 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<