js大數(shù)相加出現(xiàn)精度丟失、運(yùn)算錯(cuò)誤的問(wèn)題
js中數(shù)字類(lèi)型長(zhǎng)度達(dá)到16位時(shí),進(jìn)行加減乘除運(yùn)算,會(huì)出現(xiàn)精度丟失,運(yùn)算結(jié)果錯(cuò)誤的問(wèn)題,本文講述精度丟失的原因及解決辦法。
數(shù)字類(lèi)型Number轉(zhuǎn)換超過(guò)16位精度丟失
Number轉(zhuǎn)換16位正常;Number轉(zhuǎn)換17位精度丟失,16位以后的數(shù)字都會(huì)轉(zhuǎn)換成0。
網(wǎng)上資料說(shuō):js的number類(lèi)型有個(gè)最大安全值,即2的53次方(9007199254740992),超過(guò)這個(gè)值就會(huì)出現(xiàn)精度丟失的問(wèn)題。
上面這個(gè)說(shuō)法還是不準(zhǔn)確的,應(yīng)該是超過(guò)16位出現(xiàn)精度丟失,16位以后的數(shù)字都會(huì)轉(zhuǎn)換成0。
解決方案
1、使用BigInt 轉(zhuǎn)換數(shù)字
BigInt
是一種內(nèi)置對(duì)象,它提供了一種方法來(lái)表示大于 2^53 - 1 的整數(shù)。這原本是 Javascript中可以用Number表示的最大數(shù)字。BigInt 可以表示任意大的整數(shù)
BigInt轉(zhuǎn)換后要進(jìn)行加減乘除運(yùn)算的話,另一個(gè)也必須要經(jīng)過(guò)BigInt 轉(zhuǎn)換,示例如下
let str = '1161453901956706780'; let num= BigInt(str) + BigInt(1); console.log(String(num)); console.log(String(num).split('n')[0]);
2、轉(zhuǎn)換成字符串,自定義函數(shù)
自定義函數(shù)sumBigNumber(a, b),注意這里的參數(shù)a和b都是字符串。
function sumBigNumber(a, b) { var res = '',temp = 0; a = a.split(''); b = b.split(''); while (a.length || b.length || temp) { temp += ~~a.pop() + ~~b.pop(); res = (temp % 10) + res; temp = temp > 9; } return res.replace(/^0+/, ''); }
到此這篇關(guān)于js大數(shù)相加出現(xiàn)精度丟失、運(yùn)算錯(cuò)誤的問(wèn)題的文章就介紹到這了,更多相關(guān)js大數(shù)相加精度丟失內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript實(shí)現(xiàn)瀑布流圖片效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)瀑布流圖片效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06JavaScript對(duì)象的創(chuàng)建模式與繼承模式示例講解
繼承機(jī)制是面向?qū)ο蟪绦蛟O(shè)計(jì)使代碼可以復(fù)用的最重要的手段,它允許程序員在保持原有的特性基礎(chǔ)上進(jìn)行擴(kuò)展,增加功能,這樣產(chǎn)生新的類(lèi),稱(chēng)作是派生類(lèi)。繼承呈現(xiàn)了面向?qū)ο蟪绦蛟O(shè)計(jì)的層析結(jié)構(gòu),體現(xiàn)了由簡(jiǎn)單到復(fù)雜的認(rèn)知過(guò)程。繼承是類(lèi)設(shè)計(jì)層次的復(fù)用2022-12-12JavaScript常用基礎(chǔ)知識(shí)強(qiáng)化學(xué)習(xí)
這篇文章主要介紹了JavaScript常用基礎(chǔ)知識(shí)強(qiáng)化學(xué)習(xí),需要的朋友可以參考下2015-12-12AI小程序之語(yǔ)音聽(tīng)寫(xiě)來(lái)了,十分鐘掌握百度大腦語(yǔ)音聽(tīng)寫(xiě)全攻略
語(yǔ)音識(shí)別極速版能將60秒以?xún)?nèi)的完整音頻文件識(shí)別為文字,本文主要介紹采用百度語(yǔ)音識(shí)別,實(shí)現(xiàn)小程序的聽(tīng)寫(xiě)功能,感興趣的同學(xué)可以來(lái)了解一下2020-03-03layui實(shí)現(xiàn)鼠標(biāo)移動(dòng)到單元格上顯示數(shù)據(jù)的方法
今天小編就為大家分享一篇layui實(shí)現(xiàn)鼠標(biāo)移動(dòng)到單元格上顯示數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09js簡(jiǎn)單判斷移動(dòng)端系統(tǒng)的方法
這篇文章主要介紹了js簡(jiǎn)單判斷移動(dòng)端系統(tǒng)的方法,通過(guò)JavaScript的navigator.userAgent相關(guān)屬性判斷訪問(wèn)端的系統(tǒng)類(lèi)型,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2016-02-02iframe的父子窗口之間的對(duì)象相互調(diào)用基本用法
iframe在使用時(shí)可能會(huì)涉及到父子窗口之間傳值和方法的相互調(diào)用,研究了一下其實(shí)非常簡(jiǎn)單,就那么幾個(gè)用法而已,在此與大家分享下,感興趣的朋友可以參考下2013-09-09echarts餅圖自定義設(shè)置顏色的3種實(shí)現(xiàn)方式
ECharts餅圖的顏色可以通過(guò)多種方式進(jìn)行設(shè)置,下面這篇文章主要給大家介紹了關(guān)于echarts餅圖自定義設(shè)置顏色的3種實(shí)現(xiàn)方式,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02IE6-IE9中tbody的innerHTML不能賦值的解決方法
這篇文章主要介紹了IE6-IE9中tbody的innerHTML不能賦值的解決方法,很實(shí)用,需要的朋友可以參考下2014-09-09