背景:
在 JavaScript 里面,数字均为双精度浮点类型,即一个介于±2−1023和±2+1024之间的数字,或约为±10−308到±10+308,数字精度为53位。整数数值仅在±(253 - 1)的范围内可以表示准确。
JS 的最大和最小安全值可以这样获得:
1
2
|
console.log(Number.MAX_SAFE_INTEGER); //9007199254740991
console.log(Number.MIN_SAFE_INTEGER); //-9007199254740991
|
通过下面的例子,你会明白为什么大于这个值的运算是不安全的:
1
2
3
|
var x = 9223372036854775807;
console.log(x === x + 1);// output: true
console.log(x === x + 1000); //output: true
|
用js实现正整数大数相加:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
//用字符串表示大数
let x = "9007199254740991"; //Number.MAX_SAFE_INTEGER
let y = "99999999999999999999"; //20位大数
function bigNumberAdd(x, y) {
//为了把两个数字从个位开始相加,需要补齐位数较小的数,让两个数的位数相等
let maxLength = Math.max(x.length, y.length);
//用0补齐位数
x = x.padStart(maxLength, 0);
y = y.padStart(maxLength, 0);
let carryOver = 0; //进位
let resultStr = ""; //最终计算结果
for (let i = maxLength - 1; i >= 0; i--) {
let digitSum = parseInt(x[i]) + parseInt(y[i]) + carryOver;
let currentDigit = digitSum % 10; //取个位
carryOver = Math.floor(digitSum / 10); //取进位
resultStr = currentDigit + resultStr;
}
//如果进位还有1
if (carryOver == 1) {
resultStr = "1" + resultStr;
}
return resultStr;
}
|