js大數(shù)相加出現(xiàn)精度丟失、運算錯誤的問題
js中數(shù)字類型長度達到16位時,進行加減乘除運算,會出現(xiàn)精度丟失,運算結(jié)果錯誤的問題,本文講述精度丟失的原因及解決辦法。
數(shù)字類型Number轉(zhuǎn)換超過16位精度丟失
Number轉(zhuǎn)換16位正常;Number轉(zhuǎn)換17位精度丟失,16位以后的數(shù)字都會轉(zhuǎn)換成0。
網(wǎng)上資料說:js的number類型有個最大安全值,即2的53次方(9007199254740992),超過這個值就會出現(xiàn)精度丟失的問題。
上面這個說法還是不準確的,應(yīng)該是超過16位出現(xiàn)精度丟失,16位以后的數(shù)字都會轉(zhuǎn)換成0。
解決方案
1、使用BigInt 轉(zhuǎn)換數(shù)字
BigInt
是一種內(nèi)置對象,它提供了一種方法來表示大于 2^53 - 1 的整數(shù)。這原本是 Javascript中可以用Number表示的最大數(shù)字。BigInt 可以表示任意大的整數(shù)
BigInt轉(zhuǎn)換后要進行加減乘除運算的話,另一個也必須要經(jīng)過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)精度丟失、運算錯誤的問題的文章就介紹到這了,更多相關(guān)js大數(shù)相加精度丟失內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript對象的創(chuàng)建模式與繼承模式示例講解
繼承機制是面向?qū)ο蟪绦蛟O(shè)計使代碼可以復用的最重要的手段,它允許程序員在保持原有的特性基礎(chǔ)上進行擴展,增加功能,這樣產(chǎn)生新的類,稱作是派生類。繼承呈現(xiàn)了面向?qū)ο蟪绦蛟O(shè)計的層析結(jié)構(gòu),體現(xiàn)了由簡單到復雜的認知過程。繼承是類設(shè)計層次的復用2022-12-12layui實現(xiàn)鼠標移動到單元格上顯示數(shù)據(jù)的方法
今天小編就為大家分享一篇layui實現(xiàn)鼠標移動到單元格上顯示數(shù)據(jù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09iframe的父子窗口之間的對象相互調(diào)用基本用法
iframe在使用時可能會涉及到父子窗口之間傳值和方法的相互調(diào)用,研究了一下其實非常簡單,就那么幾個用法而已,在此與大家分享下,感興趣的朋友可以參考下2013-09-09echarts餅圖自定義設(shè)置顏色的3種實現(xiàn)方式
ECharts餅圖的顏色可以通過多種方式進行設(shè)置,下面這篇文章主要給大家介紹了關(guān)于echarts餅圖自定義設(shè)置顏色的3種實現(xiàn)方式,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-02-02IE6-IE9中tbody的innerHTML不能賦值的解決方法
這篇文章主要介紹了IE6-IE9中tbody的innerHTML不能賦值的解決方法,很實用,需要的朋友可以參考下2014-09-09