淺談JS中小數(shù)相加不精確的原因
前言
Javascript是一種強(qiáng)大的編程語(yǔ)言,可以輕松處理各種數(shù)據(jù)類(lèi)型,包括字符串、數(shù)字、數(shù)組等等。然而,在處理數(shù)字問(wèn)題時(shí),我們有可能遇到小數(shù)相加不準(zhǔn)確的問(wèn)題。
這個(gè)問(wèn)題一直存在于Javascript語(yǔ)言中,它的原因是因?yàn)?strong>Javascript采用的是二進(jìn)制浮點(diǎn)數(shù)表示法。
在這篇博客中,我們將詳細(xì)解釋為什么會(huì)出現(xiàn)這個(gè)問(wèn)題,并介紹一些解決這個(gè)問(wèn)題的方法。
Javascript中小數(shù)相加的問(wèn)題
在Javascript中,小數(shù)就是浮點(diǎn)數(shù)。在進(jìn)行小數(shù)相加時(shí),我們可能會(huì)遇到下面這種情況:
var a = 0.1; var b = 0.2; var c = a + b; console.log(c); // 輸出0.300000004
這個(gè)結(jié)果看起來(lái)很奇怪,因?yàn)槲覀兤谕妮敵鰬?yīng)該是0.3,而不是0.300000004。這是因?yàn)樵贘avascript中,小數(shù)的計(jì)算是采用二進(jìn)制浮點(diǎn)數(shù)表示法進(jìn)行的。在這種表示法中,一個(gè)小數(shù)通常是由一個(gè)正負(fù)符號(hào)、一個(gè)基數(shù)(也稱作底數(shù))和一個(gè)指數(shù)(也稱作階碼)組成的。
舉個(gè)例子,假設(shè)我們要表示0.75這個(gè)小數(shù),首先我們需要找到這個(gè)小數(shù)的二進(jìn)制表示法:
0.75 = (1 * 2^-1) + (1 * 2^-2)
在這個(gè)表示法中,1代表這一位的權(quán)重被包含在內(nèi),0代表這一位的權(quán)重沒(méi)有被包含在內(nèi)。對(duì)于0.75這個(gè)小數(shù),我們可以用下面這個(gè)二進(jìn)制數(shù)表示:
0.11
這個(gè)二進(jìn)制數(shù)表示法就是Javascript中小數(shù)的計(jì)算方式。但是,由于二進(jìn)制無(wú)法準(zhǔn)確地表示某些十進(jìn)制小數(shù),所以在計(jì)算時(shí)會(huì)出現(xiàn)誤差。這就是上面的例子中為什么要輸出0.300000004的原因。
如何讓小數(shù)相加的結(jié)果保持準(zhǔn)確?
我們了解了Javascript中小數(shù)相加不準(zhǔn)確的原因,下面來(lái)探討如何讓小數(shù)相加的結(jié)果保持準(zhǔn)確。以下是幾種解決方案:
1.使用toFixed()
這是一種比較簡(jiǎn)單的解決方案,它將小數(shù)轉(zhuǎn)換為字符串,并舍入到指定的小數(shù)位數(shù)。然后,將兩個(gè)小數(shù)值做加法操作。一旦計(jì)算完成,它將再次轉(zhuǎn)換為數(shù)字類(lèi)型。以下是代碼示例:
var a = 0.1; var b = 0.2; var c = (a + b).toFixed(1); console.log(c); // 0.3
2.使用bignumber.js
bignumber.js是一個(gè)JavaScript庫(kù),使得開(kāi)發(fā)人員可以使用大數(shù)字。它提供了高精度的數(shù)字運(yùn)算,可以處理超越Javascript整數(shù)和小數(shù)的數(shù)字。下面是一個(gè)使用bignumber.js的例子:
安裝bignumber.js
npm install bignumber.js
使用bignumber.js
javascriptCopy code var BigNumber = require('bignumber.js').default; var a = new BigNumber('0.1'); var b = new BigNumber('0.2'); var c = a.plus(b); console.log(c.toString()); // 0.3
3.使用ES6的Number.MAX_SAFE_INTEGER屬性
Javascript中的Number類(lèi)型有一個(gè)MAX_SAFE_INTEGER屬性,它定義了Javascript中可安全表示的最大整數(shù)。可以使用這個(gè)屬性來(lái)計(jì)算小數(shù),然后使用toPrecision()方法將其舍入到指定的精度。以下是示例代碼:
cssCopy code var a = 0.1; var b = 0.2; var c = Number((a + b).toPrecision(12)); console.log(c); // 0.3
到此這篇關(guān)于淺談JS中小數(shù)相加不精確的原因的文章就介紹到這了,更多相關(guān)JS中小數(shù)相加 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript中Number.isNaN 和 isNaN 的區(qū)別詳解
本文和大家分享一個(gè)前幾天寫(xiě)代碼踩的坑,筆者在業(yè)務(wù)邏輯中需要對(duì)一個(gè)值進(jìn)行NaN的判斷,由于筆者的不嚴(yán)謹(jǐn),使用了isNaN,從而引起B(yǎng)ug,也正是因?yàn)檫@個(gè),筆者才知道了isNaN和Number.isNaN的區(qū)別,所以本文就和大家聊聊它們的區(qū)別2023-09-09JavaScript如何刪除對(duì)象的某個(gè)屬性詳析
這篇文章主要給大家介紹了關(guān)于JavaScript如何刪除對(duì)象的某個(gè)屬性的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05原生JS實(shí)現(xiàn)網(wǎng)絡(luò)彩票投注效果
分享一個(gè)最近模仿市面彩票系統(tǒng)寫(xiě)個(gè)小案例,沒(méi)有使用任何后臺(tái),從投注到開(kāi)獎(jiǎng)再到返獎(jiǎng)都是用原生JS實(shí)現(xiàn)的。2016-09-09判斷div滑動(dòng)到底部的scroll實(shí)例代碼
下面小編就就為大家分享一篇判斷div滑動(dòng)到底部的scroll實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-11-11關(guān)于JavaScript的with 語(yǔ)句的使用方法
JavaScript 有個(gè) with 關(guān)鍵字, with 語(yǔ)句的原本用意是為逐級(jí)的對(duì)象訪問(wèn)提供命名空間式的速寫(xiě)方式. 也就是在指定的代碼區(qū)域, 直接通過(guò)節(jié)點(diǎn)名稱調(diào)用對(duì)象2011-05-05JavaScript用20行代碼實(shí)現(xiàn)虎年春節(jié)倒計(jì)時(shí)
春節(jié)將至,相信大家跟小編一樣很激動(dòng)呀。為了迎接虎年春節(jié)到來(lái),小編為大家準(zhǔn)備了一個(gè)虎年春節(jié)倒計(jì)時(shí),僅20行代碼用js就實(shí)現(xiàn)啦。感興趣的可以動(dòng)手試一試2022-01-01一文帶你詳細(xì)理解uni-app如何構(gòu)建小程序
uni-app是近年來(lái)一種新興的多端混合開(kāi)發(fā)框架,適合開(kāi)發(fā)跨平臺(tái)應(yīng)用,方便多端運(yùn)行,下面這篇文章主要給大家介紹了關(guān)于uni-app如何構(gòu)建小程序的相關(guān)資料,需要的朋友可以參考下2022-11-11jQuery animate()實(shí)現(xiàn)背景色漸變效果的處理方法【使用jQuery.color.js插件】
這篇文章主要介紹了jQuery animate()實(shí)現(xiàn)背景色漸變效果的處理方法,結(jié)合實(shí)例形式分析了jQuery顏色插件jquery.color.js實(shí)現(xiàn)背景色漸變的簡(jiǎn)單操作技巧,需要的朋友可以參考下2017-03-03小程序根據(jù)手機(jī)機(jī)型設(shè)置自定義底部導(dǎo)航距離
這篇文章主要為大家詳細(xì)介紹了小程序根據(jù)手機(jī)機(jī)型設(shè)置自定義底部導(dǎo)航距離,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06