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
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;
}

分享

Llane00
作者
Llane00
Web Developer