大数相加
两个特别大的数相加,超过计算机内存,就会丢失精度,出现错误。
- 使用es6的bigInt数据类型转换
- 使用数组进行运算。
思路:将大数转成字符串,然后转为数组,通过数组的单独每一位进行相加。
// 计算 610087408935546875875+ 23087408935546875871 的结果
function bigNumberSum(num1, num2){
const num1Array = num1.split("").reverse();
const num2Array = num2.split("").reverse();
// 计算出2个数中最长的位数
let len = Math.max(num1Array.length, num2Array.length);
// 相加的结果,用数组保存着每一个数字位
const result = [];
let flag = 0; //标记是否需要进位
for(let i=0; i<len; i++){
const n1 = Number(num1Array[i]) || 0; //为了防止超过了原有的位数,赋默认值0
const n2 = Number(num2Array[i]) || 0;
let sum = n1 + n2 + flag;
if(sum >= 10) {
sum = sum % 10;
flag = 1; // 表示进位1
}else {
flag = 0; // 不超过10,不用进位
}
result.push(sum);
if(i === len-1 && flag){ //到了最后一位,并且此时还有进位
result.push(flag);
}
}
return result.reverse().join("");
}
console.log(bigNumberSum('610087408935546875875', '23087408935546875871')); //'633174817871093751746'
// 或者使用BigInt
(BigInt('610087408935546875875')+BigInt('23087408935546875871')).toString()
// '633174817871093751746'
浮点数,小数相加
在js中计算0.1+0.2 === 0.3
的情况下,结果为false。
console.log(0.1 + 0.2) // 0.30000000000000004
(0.1).toString(2) // 0.0001100110011001100110011001100110011001100110011001101
(0.2).toString(2) // 0.001100110011001100110011001100110011001100110011001101
出现这种情况的原因是,相加时计算机会把数字转为二进制相加。
function floatAdd(n1, n2) {
var r1, r2, max;
try {
r1 = n1.toString().split(".")[1].length // 获取n1小数点后数字的长度
} catch (e) {
r1 = 0
}
try {
r2 = n2.toString().split(".")[1].length // 获取n2小数点后数字的长度
} catch (e) {
r2 = 0
}
max = Math.pow(10, Math.max(r1, r2));
return (n1 * max + n2 * max) / max
}
console.log(floatAdd(0.1, 0.2)) //0.3