Please enable Javascript to view the contents

Js实现大数相加

 ·  ☕ 1 分钟

背景:

在 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
}
分享

Llane00
作者
Llane00
Web Developer