js大整数运算
2019-08-29 本文已影响0人
躺在家里干活
对于大整数,是指超过规定类型的整数,它一般的存储类型为字符串类型char。在JS中,需要将字符串中的每一位字符利用parseInt()转成整数,再做加减,否则最后的结果是字符串的连接
举个栗子?
9999999999999999 == 10000000000000000; // true
当 x 大于 2^53 且二进制有效位数大于 53 位时,就会存在精度丢失。这和小数的精度丢失本质上是一样的。小数和大整数的精度丢失,并不仅仅在 JavaScript 中存在。严格来说,使用了IEEE 754 浮点数格式来存储浮点类型的任何编程语言(C/C++/C#/Java 等等)都存在精度丢失问题。在 C#、Java 中,提供了 Decimal、BigDecimal 封装类来进行相应的处理,才避开了精度丢失。
大整数相加
function add(a, b) {
const lena = a.split('').length;
const lenb = b.split('').length;
let maxLen;
let minLen;
let result;
let total = [];
let addFlag = 0;
if (lena > lenb) {
maxLen = lena;
minLen = lenb;
} else {
maxLen = lenb;
minLen = lena;
}
for (let i = maxLen - 1, j = minLen - 1; i >= 0; i--, j--) {
if (j >= 0) {
result = parseInt(a[i]) + parseInt(b[j]) + addFlag;
} else {
result = parseInt(a[i]) + addFlag;
}
if (result > 9) {
result = result - 10;
if (i == (maxLen.length - 1)) result[maxLen.length] = 1;
addFlag = 1;
total.unshift(result);
} else {
total.unshift(result);
addFlag = 0;
}
}
const final = total.join('');
return final;
}
console.log(add('1112343', '12348')); // 1124691
大整数相乘
function multi(a, b) {
var str1, str2, len1, len2, maxlen, result = [];
str1 = a.split("").reverse();
str2 = b.split("").reverse();
len1 = str1.length;
len2 = str2.length;
//因为要在下一步做累加,如果不初始化为0,result[]中的值会变为NaN
//因为未初始化的数组中的值为undefined
for (var i = 0; i < len1; i++)
for (var j = 0; j < len2; j++)
result[i + j] = 0;
for (var i = 0; i < len1; i++)
for (var j = 0; j < len2; j++)
//根据乘法的手动计算方式,在上下相同位上会有相加
result[i + j] += parseInt(str1[i]) * parseInt(str2[j]);
var n = result.length;
for (var k = 0; k < n; k++) {
var temp = result[k];
if (temp >= 10) {
result[k] = temp % 10;
//JS中的"/"不是除法取整,会取得小数,所以要用Math.floor()
result[k + 1] += Math.floor(temp / 10);
}
}
return result.reverse().join("");
}
var d = multi("99999999999999999", "1");
console.log(d);
大整数相减
function jian(a, b) {
var zong = [String(a), String(b)];
var fen = [];
zong = getMax(zong[0], zong[1]);
if (zong.length == 3) {
//alert("不足");
return false;
}
zong[0] = zong[0].split('');
zong[1] = zong[1].split('');
var jialing;
if (!(zong[0].length == zong[1].length)) {
jialing = new Array(zong[0].length - zong[1].length + 1).join('0');
zong[1] = jialing.split('').concat(zong[1]);
}
var next = 0;
for (var i = (zong[0].length - 1); i >= 0; i--) {
var cha = Number(zong[0][i]) - Number(zong[1][i]) - next;
next = 0;
if (cha < 0) {
cha = cha + 10;
next = 1;
}
fen.unshift(cha % 10);
}
var result = fen.join('');
if (result[0] == 0) {
result = shanchuling(result);
}
return result;
}