原文:实现 (5).add(3).minus(2) 功能 - 每天一个JavaScript小知识@Js中文网 · 码农进阶题库

原文地址:https://www.javascriptc.com/interview-tips/zh_cn/javascript/add-is-and-minus/

题目描述:

实现 (5).add(3).minus(2) 功能

解题:

  • 思路一:
    Number.prototype.add = function(n) {
    return this.valueOf() + n;
    };
    Number.prototype.minus = function(n) {
    return this.valueOf() - n;
    };
    console.log((5).add(3).minus(2)); // 6
    
  • 思路二: <!– + 解决JS的经典的浮点数陷阱
  • 2.1 - 1.9 = 0.20000000000000018 –>
    Number.MAX_SAFE_DIGITS = Number.MAX_SAFE_INTEGER.toString().length-2
    Number.prototype.digits = function(){
      let result = (this.valueOf().toString().split('.')[1] || '').length
      return result > Number.MAX_SAFE_DIGITS ? Number.MAX_SAFE_DIGITS : result
    }
    Number.prototype.add = function(i=0){
      if (typeof i !== 'number') {
          	throw new Error('请输入正确的数字');
      	}
      const v = this.valueOf();
      const thisDigits = this.digits();
      const iDigits = i.digits();
      const baseNum = Math.pow(10, Math.max(thisDigits, iDigits));
      const result = (v * baseNum + i * baseNum) / baseNum;
      if(result>0){ return result > Number.MAX_SAFE_INTEGER ? Number.MAX_SAFE_INTEGER : result }
      else{ return result < Number.MIN_SAFE_INTEGER ? Number.MIN_SAFE_INTEGER : result }
    }
    Number.prototype.minus = function(i=0){
      if (typeof i !== 'number') {
          	throw new Error('请输入正确的数字');
      	}
      const v = this.valueOf();
      const thisDigits = this.digits();
      const iDigits = i.digits();
      const baseNum = Math.pow(10, Math.max(thisDigits, iDigits));
      const result = (v * baseNum - i * baseNum) / baseNum;
      if(result>0){ return result > Number.MAX_SAFE_INTEGER ? Number.MAX_SAFE_INTEGER : result }
      else{ return result < Number.MIN_SAFE_INTEGER ? Number.MIN_SAFE_INTEGER : result }
    }
    
  • 【大数加减:直接通过 Number 原生的安全极值来进行判断,超出则直接取安全极值】
  • 【超级多位数的小数加减:取JS安全极值位数-2作为最高兼容小数位数】 超级多位数的小数加减:取JS安全极值位数-2作为最高兼容小数位数

扩展阅读: