认识最值
// 最大值
Number.MAX_VALUE // 1.7976931348623157e+308
// 最大安全整数
Number.MAX_SAFE_INTEGER // 9007199254740991
// 最小值
Number.MIN_VALUE // 5e-324
// 最小安全整数
Number.MIN_SAFE_INTEGER // -9007199254740991
所谓安全整数,就是不在安全整数范围内计算就会不安全,以下为一个最大安全整数加法运算案例
很明显,计算结果超出了安全范围,他的值就出现了问题
实现在安全整数外进行精确操作数值sumBigNums(a, b) {
let carry = 0, res = ' ';
a = a.toString().split("");
b = b.toString().split("");
while (a.length || b.length) {
carry += ~~a.pop() + ~~b.pop();
res = (carry % 10) + res;
carry = carry > 9;
}
return res.replace(/^0+/, '');
}
以上代码只实现了正整数+正整数
实现思路:
首先将超大数转为字符串,保证了相对值在数学表示上不会发生改变
初始化res, carry变量来存储a b的最后一位相加的结果,在将两个字符串split为数组,以便进行每一位的运算
循环体内 首先 进行 最后一位 的运算,将二者最末尾的两个数相加,由于每一位数字是0 - 9,相加可能存在进位,如果进位,res拼接进位后的个位,carry保存当前是否进位。
如果carry为true,表示上一次计算进位了,按循环顺序,当前刚好又是上一次的进位计算,正好可以把上次的进位加入到这次
一直循环,直到结束
最后将计算的字符串结果去除0开头
就此,可以推理出负数运算,以及其他加减乘除运算,都是基于字符串的操作