如何使用big.js解決JavaScript浮點(diǎn)數(shù)精度丟失問(wèn)題
一、精度丟失
關(guān)于浮點(diǎn)數(shù)計(jì)算精度丟失是很多語(yǔ)言都存在的問(wèn)題,例如比較著名的:
0.1 + 0.2 === 0.30000000000000004
最近在項(xiàng)目中涉及到金額從元轉(zhuǎn)為分(乘100即可),發(fā)現(xiàn)乘法居然也會(huì)有精度丟失的問(wèn)題:
19.9 * 100 === 1989.9999999999998
因?yàn)樯婕暗搅私痤~,所以一定不能出現(xiàn)這樣的問(wèn)題??梢灾苯邮褂?
Number(Number(19.9 * 100).toFixed()) === 1990
但其實(shí)toFixed()方法也會(huì)造成的精度丟失,后來(lái)發(fā)現(xiàn),有一個(gè)專(zhuān)門(mén)處理js精度問(wèn)題的庫(kù):http://mikemcl.github.io/big.js/
二、Big.js
安裝:
npm install big.js
項(xiàng)目中引入:
import Big from 'big.js';
使用Big構(gòu)造函數(shù)可以創(chuàng)建一個(gè)Big對(duì)象,調(diào)用對(duì)應(yīng)的方法即可實(shí)現(xiàn)我們的計(jì)算需求。
let x = new Big(0.1)
注意最后我們需要使用toNumber方法重新將Big對(duì)象轉(zhuǎn)為數(shù)字。
2.1 加
Big對(duì)象上的plus
方法實(shí)現(xiàn)加運(yùn)算。
0.1 + 0.2 // 0.30000000000000004 x = new Big(0.1) y = x.plus(0.2).toNumber() // 0.3 Big(0.7).plus(x).plus(y).toNumber() // 1.1
2.2 減
Big對(duì)象上的minus
方法實(shí)現(xiàn)減運(yùn)算。
0.3 - 0.1 // 0.19999999999999998 x = new Big(0.3) x.minus(0.1).toNumber() // 0.2
2.3 乘
Big對(duì)象上的times
方法實(shí)現(xiàn)乘運(yùn)算。
0.6 * 3 // 1.7999999999999998 x = new Big(0.6) y = x.times(3).toNumber() // 1.8 Big('7e+500').times(y).toNumber() // Infinity Big('7e+500').times(1.8).toString() // '1.26e+501'
2.4 除
Big對(duì)象上的div
方法實(shí)現(xiàn)除運(yùn)算。
x = new Big(355) y = new Big(113) x.div(y).toNumber() // 3.14159292035398230088 Big.DP = 2 x.div(y).toNumber() // 3.14 x.div(5).toNumber() // 71
DP:涉及除法的操作結(jié)果的最大小數(shù)位數(shù)。它僅與 div 和 sqrt 方法相關(guān),以及當(dāng)指數(shù)為負(fù)時(shí)與 pow 方法相關(guān)。
2.5 指數(shù)
Big對(duì)象上的pow
方法實(shí)現(xiàn)指數(shù)運(yùn)算。
Math.pow(0.7, 2) // 0.48999999999999994 x = new Big(0.7) x.pow(2) // '0.49' Big.DP = 20 Big(3).pow(-2) // '0.11111111111111111111' new Big(123.456).pow(1000).toString().length // 5099 new Big(2).pow(1e+6) // Time taken (Node.js): 9 minutes 34 secs.
到此這篇關(guān)于如何使用big.js解決JavaScript浮點(diǎn)數(shù)精度丟失問(wèn)題的文章就介紹到這了,更多相關(guān)js浮點(diǎn)數(shù)精度丟失內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS表單驗(yàn)證方法實(shí)例小結(jié)【電話(huà)、身份證號(hào)、Email、中文、特殊字符、身份證號(hào)等】
這篇文章主要介紹了JS表單驗(yàn)證方法,結(jié)合實(shí)例形式總結(jié)分析了常用的表單驗(yàn)證技巧,包括電話(huà)、身份證號(hào)、Email、中文、特殊字符、身份證號(hào)等驗(yàn)證方法,需要的朋友可以參考下2017-02-02JavaScript中操作Mysql數(shù)據(jù)庫(kù)實(shí)例
這篇文章主要介紹了JavaScript中操作Mysql數(shù)據(jù)庫(kù)實(shí)例,本文直接給出實(shí)現(xiàn)代碼,代碼中包含詳細(xì)注釋,需要的朋友可以參考下2015-04-04Bootstrap3 datetimepicker控件使用實(shí)例
這篇文章主要為大家詳細(xì)介紹了Bootstrap3 datetimepicker控件使用實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12詳解babel是如何將class語(yǔ)法糖轉(zhuǎn)換為es5的語(yǔ)法
這篇文章主要詳細(xì)介紹了babel是如何將class語(yǔ)法糖轉(zhuǎn)換為es5的語(yǔ)法,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-02-02JavaScript使用structuredClone實(shí)現(xiàn)深拷貝
在JavaScript中,實(shí)現(xiàn)深拷貝的方式有很多種,每種方式都有其優(yōu)點(diǎn)和缺點(diǎn),今天介紹一種原生JavaScript提供的structuredClone實(shí)現(xiàn)深拷貝,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03單行 JS 實(shí)現(xiàn)移動(dòng)端金錢(qián)格式的輸入規(guī)則
這篇文章主要介紹了單行 JS 實(shí)現(xiàn)移動(dòng)端金錢(qián)格式的輸入規(guī)則,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-05-05