背景:
在 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
|
//用字符串表示大数
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
}
|