国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

如何解決0.1 +0.2===0.30000000000000004類問題

yuanzhanghu / 1181人閱讀

摘要:方法使用定點表示法來格式化一個數,會對結果進行四舍五入。該數值在必要時進行四舍五入,另外在必要時會用來填充小數部分,以便小數部分有指定的位數。如果數值大于,該方法會簡單調用并返回一個指數記數法格式的字符串。在環境中,只能是之間,測試版本為。

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

一.類庫部分 math.js

math.js是JavaScript和Node.js的一個廣泛的數學庫。支持數字,大數,復數,分數,單位和矩陣等數據類型的運算。

官網:http://mathjs.org/
GitHub:https://github.com/josdejong/mathjs

0.1+0.2 ===0.3實現代碼:

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 提供十進制類型的任意精度數值。

官網: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

用于任意精度算術的JavaScript庫。

官網: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

用于任意精度十進制算術的小型快速JavaScript庫。
官網: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"

有一個需要注意的點,使用類庫此時輸出的0.3是String類型,因此若想保持為Number類型,可使用parseFloat()方法。

還有一個注意點,在本地install測試的時候,npm i mathjs -g ,require是也要require("mathjs"),而不是帶點的math.js,因為josdejong這哥們在創建項目的時候就命名為mathjs,而同時擁有上述decimal.js, bignumber.js和big.js的MikeMcl,項目名字就帶了dot,因此安裝和引入時,都是xxx.js的形式。

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

最后,教大家一個線上直接測試的網站,https://npm.runkit.com,子路徑輸入想要測試的Node.js package名,就可以實現在線測試包中的api了。
例如:
math.js:https://npm.runkit.com/mathjs
big.js:https://npm.runkit.com/big.js

二、原生方法

類庫其實很強大,我們計算0.1+0.2其實只是用到了冰山一角,那么我們如何使用原生的EcmaScript代碼來應用于簡單的問題場景呢?

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

浮點數運算

toFixed() 方法

浮點數運算的解決方案有很多,這里給出一種目前常用的解決方案, 在判斷浮點數運算結果前對計算結果進行精度縮小,因為在精度縮小的過程總會自動四舍五入。

toFixed() 方法使用定點表示法來格式化一個數,會對結果進行四舍五入。語法為:

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

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

特別注意:toFixed() 返回一個數值的字符串表現形式。

具體可以查看 MDN中的說明,那么我們可以這樣解決精度問題:

JavaScript 代碼:

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

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

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

desktop端:

mobile端:

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/89610.html

相關文章

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

    摘要:也就是說不僅是會產生這種問題,只要是采用的浮點數編碼方式來表示浮點數時,則會產生這類問題。到這里我們都理解只要采取的浮點數編碼的語言均會出現上述問題,只是它們的標準類庫已經為我們提供了解決方案而已。 Brief 一天有個朋友問我JS中計算0.7 * 180怎么會等于125.99999999998,坑也太多了吧!那時我猜測是二進制表示數值時發生round-off error所導致,但并不...

    JerryWangSAP 評論0 收藏0
  • 探尋 JavaScript 精度問題以及解決方案

    摘要:推導為何等于在中所有數值都以標準的雙精度浮點數進行存儲的。先來了解下標準下的雙精度浮點數。精度位總共是,因為用科學計數法表示,所以首位固定的就沒有占用空間。驗證完成的最大安全數是如何來的根據雙精度浮點數的構成,精度位數是。 閱讀完本文可以了解到 0.1 + 0.2 為什么等于 0.30000000000000004 以及 JavaScript 中最大安全數是如何來的。 十進制小數轉為二...

    YanceyOfficial 評論0 收藏0
  • JS中如何理解浮點數?

    摘要:本文通過介紹的二進制存儲標準來理解浮點數運算精度問題,和理解對象的等屬性值是如何取值的,最后介紹了一些常用的浮點數精度運算解決方案。浮點數精度運算解決方案關于浮點數運算精度丟失的問題,不同場景可以有不同的解決方案。 本文由云+社區發表 相信大家在平常的 JavaScript 開發中,都有遇到過浮點數運算精度誤差的問題,比如 console.log(0.1+0.2===0.3)// fa...

    bang590 評論0 收藏0
  • 深度剖析0.1 +0.2===0.30000000000000004的原因

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

    haobowd 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<