js大数相加出现精度丢失、运算错误的问题
js中数字类型长度达到16位时,进行加减乘除运算,会出现精度丢失,运算结果错误的问题,本文讲述精度丢失的原因及解决办法。
数字类型Number转换超过16位精度丢失
Number转换16位正常;Number转换17位精度丢失,16位以后的数字都会转换成0。
网上资料说:js的number类型有个最大安全值,即2的53次方(9007199254740992),超过这个值就会出现精度丢失的问题。
上面这个说法还是不准确的,应该是超过16位出现精度丢失,16位以后的数字都会转换成0。
解决方案
1、使用BigInt 转换数字
BigInt
是一种内置对象,它提供了一种方法来表示大于 2^53 - 1 的整数。这原本是 Javascript中可以用Number表示的最大数字。BigInt 可以表示任意大的整数
BigInt转换后要进行加减乘除运算的话,另一个也必须要经过BigInt 转换,示例如下
let str = '1161453901956706780'; let num= BigInt(str) + BigInt(1); console.log(String(num)); console.log(String(num).split('n')[0]);
2、转换成字符串,自定义函数
自定义函数sumBigNumber(a, b),注意这里的参数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+/, ''); }
到此这篇关于js大数相加出现精度丢失、运算错误的问题的文章就介绍到这了,更多相关js大数相加精度丢失内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Javascript拖拽系列文章1之offsetParent属性
这个系列文章主要是讲述实现Javascript拖拽功能的基础知识,并将在最后给出一个完整的示例。适合对拖拽完全不懂的人阅读2008-09-09
最新评论