const a = "9007199254740991"
const b = "1234567899999999999"
function add(a ,b){
//...
}
然后将字符串长度对齐:
const a = "9007199254740991"
const b = "1234567899999999999"
function add(a, b){
//取两个数字的最大长度
let maxLength = Math.max(a.length, b.length)
//用0去补齐长度
a = a.padStart(maxLength , 0) //"0009007199254740991"
b = b.padStart(maxLength , 0) //"1234567899999999999"
}
然后从个位开始相加:
const a = "9007199254740991";
const b = "1234567899999999999";
function add(a, b) {
if (typeof a === 'number') a = String(a)
if (typeof b === 'number') b = String(b)
//取两个数字的最大长度
const maxLength = Math.max(a.length, b.length)
//用0去补齐长度
a = a.padStart(maxLength, 0)
b = b.padStart(maxLength, 0)
//定义加法过程中需要用到的变量
let t = 0
let f = 0 // 进位
let sum = ''
for(let i = maxLength; i--;) {
t = parseInt(a[i]) + parseInt(b[i]) + f
f = Math.floor(t/10)
sum = t % 10 + sum
}
if (f === 1) {
sum = '1' + sum
}
return sum
}
先从一个例子讲起
这个不用算简单看一下都知道计算结果不对,最后几位肯定应该都是1的,可是为什么会得到一个不对的值呢?
JavaScript Number的精度丢失问题
因为
JavaScript
的Number
类型是遵循 IEEE 754 规范表示的,这就意味着JavaScript
能精确表示的数字是有限的,JavaScript
可以精确到个位的最大整数是9007199254740992,也就是2的53次方,超过这个范围就会精度丢失,造成JavaScript
无法判断大小,从而会出现下面的现象:可以从下面这张图上看到
JavaScript
Number
能够精确表示的上下限:解决方案
当有两个整数 a 和 b ,在通常情况下我们有“+”运算符对其进行相加运算:
但是 JS 在存放整数的时候是有一个安全范围的,一旦数字超过这个范围便会损失精度。
我们不能拿精度损失的数字进行运行,因为运算结果一样是会损失精度的。
所以,我们要用字符串来表示数据!(不会丢失精度)
JS 中整数的最大安全范围可以查到是:9007199254740991 假如我们要进行 9007199254740991 + 1234567899999999999
我们要先准备两个字符串变量和一个方法:
然后将字符串长度对齐:
然后从个位开始相加:
运行: