大数相加

两个特别大的数相加,超过计算机内存,就会丢失精度,出现错误。

  • 使用es6的bigInt数据类型转换
  • 使用数组进行运算。

思路:将大数转成字符串,然后转为数组,通过数组的单独每一位进行相加。

  1. // 计算 610087408935546875875+ 23087408935546875871 的结果
  2. function bigNumberSum(num1, num2){
  3. const num1Array = num1.split("").reverse();
  4. const num2Array = num2.split("").reverse();
  5. // 计算出2个数中最长的位数
  6. let len = Math.max(num1Array.length, num2Array.length);
  7. // 相加的结果,用数组保存着每一个数字位
  8. const result = [];
  9. let flag = 0; //标记是否需要进位
  10. for(let i=0; i<len; i++){
  11. const n1 = Number(num1Array[i]) || 0; //为了防止超过了原有的位数,赋默认值0
  12. const n2 = Number(num2Array[i]) || 0;
  13. let sum = n1 + n2 + flag;
  14. if(sum >= 10) {
  15. sum = sum % 10;
  16. flag = 1; // 表示进位1
  17. }else {
  18. flag = 0; // 不超过10,不用进位
  19. }
  20. result.push(sum);
  21. if(i === len-1 && flag){ //到了最后一位,并且此时还有进位
  22. result.push(flag);
  23. }
  24. }
  25. return result.reverse().join("");
  26. }
  27. console.log(bigNumberSum('610087408935546875875', '23087408935546875871')); //'633174817871093751746'
  28. // 或者使用BigInt
  29. (BigInt('610087408935546875875')+BigInt('23087408935546875871')).toString()
  30. // '633174817871093751746'

浮点数,小数相加

在js中计算0.1+0.2 === 0.3的情况下,结果为false。

  1. console.log(0.1 + 0.2) // 0.30000000000000004
  2. (0.1).toString(2) // 0.0001100110011001100110011001100110011001100110011001101
  3. (0.2).toString(2) // 0.001100110011001100110011001100110011001100110011001101

出现这种情况的原因是,相加时计算机会把数字转为二进制相加。

  1. function floatAdd(n1, n2) {
  2. var r1, r2, max;
  3. try {
  4. r1 = n1.toString().split(".")[1].length // 获取n1小数点后数字的长度
  5. } catch (e) {
  6. r1 = 0
  7. }
  8. try {
  9. r2 = n2.toString().split(".")[1].length // 获取n2小数点后数字的长度
  10. } catch (e) {
  11. r2 = 0
  12. }
  13. max = Math.pow(10, Math.max(r1, r2));
  14. return (n1 * max + n2 * max) / max
  15. }
  16. console.log(floatAdd(0.1, 0.2)) //0.3