首页 > 试题广场 >

简易计算器

[编程题]简易计算器
  • 热度指数:3707 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 128M,其他语言256M
  • 算法知识视频讲解

本题展示了一个简化版的计算器,需求如下:
1、除法操作时,如果被除数为0,则结果为0
2、结果如果为小数,最多保留小数点后两位,如 2 / 3 = 0.67(显示0.67), 1 / 2 = 0.5(显示0.5)
3、请阅读并根据提示补充完成函数initEvent、result和calculate
4、请不要手动修改html和css
5、不要使用第三方插件
var Calculator = {
    init: function () {
        var that = this;
        if (!that.isInited) {
            that.isInited = true;
            // 保存操作信息
            // total: Number, 总的结果
            // next: String, 下一个和 total 进行运算的数据
            // action: String, 操作符号
            that.data = {total: 0, next: '', action: ''};
            that.bindEvent();
        }
    },
    bindEvent: function () {
        var that = this;
        // 请补充代码:获取 .cal-keyboard 元素
        var keyboardEl = document.querySelector('.cal-keyboard')

        keyboardEl && keyboardEl.addEventListener('click', function (event) {
            // 请补充代码:获取当前点击的dom元素
            var target = event.target;
            if(target.tagName !== 'LI'){return}
            // 请补充代码:获取target的 data-action 值
            var action = target.dataset.action
            // 请补充代码:获取target的内容
            var value = target.innerHTML
            if (action === 'num' || action === 'operator') {
                that.result(value, action === 'num');
            }
        });
    },
    result: function (action, isNum) {
        var that = this;
        var data = that.data;
        if (isNum) {
            data.next = data.next === '0' ? action : (data.next + action);
            !data.action && (data.total = 0);
        } else if (action === '清空') {
            // 请补充代码:设置清空时的对应状态
            data.total = 0;
            data.next = '';
            data.action = '';
        } else if (action === '=') {
            if (data.next || data.action) {
                data.total = that.calculate(data.total, data.next, data.action);
                data.next = '';
                data.action = '';
            }
        } else if (!data.next) {
            data.action = action;
        } else if (data.action) {
            data.total = that.calculate(data.total, data.next, data.action);
            data.next = '';
            data.action = action;
        } else {
            data.total = +data.next || 0;
            data.next = '';
            data.action = action;
        }
    
        // 请补充代码:获取 .origin-value 元素
        var valEl = document.querySelector('.origin-value');
        valEl && (valEl.innerHTML = data.next || data.total || '0');
    },
   calculate: function (n1, n2, operator) {
        n1 = +n1 || 0;
        n2 = +n2 || 0;
        if (operator === '÷') {
            // 请补充代码:获取除法的结果
            if(n2 == 0) {
                return 0
            }else {
                var val = n1 / n2
                return Math.round(val * 100)/100
            }
        } else if (operator === 'x') {
            // 请补充代码:获取乘法的结果
            var val = n1 * n2
            return Math.round(val * 100)/100
        } else if (operator === '+') {
            // 请补充代码:获取加法的结果
            var val = n1 + n2
            return Math.round(val * 100)/100
        } else if (operator === '-') {
            // 请补充代码:获取减法的结果
            var val = n1 - n2
            return Math.round(val * 100)/100
        }
    }
};
Calculator.init();
内存超限
发表于 2021-06-07 19:16:38 回复(0)
emoji  是咋回事呢  不让提交哦.....
发表于 2021-07-28 21:53:54 回复(1)
一直提示提交的内容不能有emoji表情,题目能不能审核好,真的服了😡
发表于 2021-08-15 21:30:13 回复(1)
操作数只有两个的整数计算器,怎么出现两个小数和的情况?
发表于 2023-05-18 10:38:36 回复(0)
基本上没啥难度额,就是跟着提示走,然后提交调试
var Calculator = {
    init: function () {
        var that = this;
        if (!that.isInited) {
            that.isInited = true;
            // 保存操作信息
            // total: Number, 总的结果
            // next: String, 下一个和 total 进行运算的数据
            // action: String, 操作符号
            that.data = {total: 0, next: '', action: ''};
            that.bindEvent();
        }
    },
    bindEvent: function () {
        var that = this;
        // 请补充代码:获取 .cal-keyboard 元素
        var keyboardEl = document.querySelector('.cal-keyboard');
        keyboardEl && keyboardEl.addEventListener('click', function (event) {
            // 请补充代码:获取当前点击的dom元素
            var target = event.target;
            // 请补充代码:获取target的 data-action 值
            var action = event.target.getAttribute("data-action");
            // 请补充代码:获取target的内容
            var value = event.target.innerText;
            if (action === 'num' || action === 'operator') {
                that.result(value, action === 'num');
            }
        });
    },
    result: function (action, isNum) {
        var that = this;
        var data = that.data;
        if (isNum) {
            data.next = data.next === '0' ? action : (data.next + action);
            !data.action && (data.total = 0);
        } else if (action === '清空') {
            // 请补充代码:设置清空时的对应状态,意思就是重置为最初状态
            data.total = 0;
            data.next = '';
            data.action = '';
        } else if (action === '=') {
            if (data.next || data.action) {
                data.total = that.calculate(data.total, data.next, data.action);
                data.next = '';
                data.action = '';
            }
        } else if (!data.next) {
            data.action = action;
        } else if (data.action) {
            data.total = that.calculate(data.total, data.next, data.action);
            data.next = '';
            data.action = action;
        } else {
            data.total = +data.next || 0;
            data.next = '';
            data.action = action;
        }
    
        // ���补充代码:获取 .origin-value 元素
        var valEl = document.querySelector('.origin-value');
        valEl && (valEl.innerHTML = data.next || data.total || '0');
    },
    calculate: function (n1, n2, operator) {
        // 隐式转化为数字类型,方便后续的运算
        n1 = +n1 || 0;
        n2 = +n2 || 0;
        function decimalNumberFormatter(num){
            if((num + '').includes('.')) return +num.toFixed(2)
            else return num
        }
        if (operator === '÷') {
            // 请补充代码:获取除法的结果
            return !n2 ? 0 : decimalNumberFormatter(n1 / n2);
        } else if (operator === 'x') {
            // 请补充代码:获取乘法的结果
            return decimalNumberFormatter(n1 * n2);
        } else if (operator === '+') {
            // 请补充代码:获取加法的结果
            return decimalNumberFormatter(n1 + n2);
        } else if (operator === '-') {
            // 请补充代码:获取减法的结果
            return decimalNumberFormatter(n1 - n2);
        }
    }
};
Calculator.init();

发表于 2022-10-14 18:10:56 回复(0)
大佬看看哪里错误了,本地测试都好好的,就是通不过      
var Calculator = {
        init: function () {
          var that = this;
          if (!that.isInited) {
            that.isInited = true;
            // 保存操作信息
            // total: Number, 总的结果
            // next: String, 下一个和 total 进行运算的数据
            // action: String, 操作符号
            that.data = { total: 0, next: "", action: "" };
            that.bindEvent();
          }
        },
        bindEvent: function () {
          var that = this;
          // 请补充代码:获取 .cal-keyboard 元素
          var keyboardEl = document.querySelector(".cal-keyboard ");
          keyboardEl &&
            keyboardEl.addEventListener("click", function (event) {
              // 请补充代码:获取当前点击的dom元素
              var target = event.target;
              // 请补充代码:获取target的 data-action 值
              var action = target.dataset?.action;
              // 请补充代码:获取target的内容
              var value = target.innerText;
              //   判断点击的数组还是运算符
              if (action === "num" || action === "operator") {
                that.result(value, action === "num");
              }
            });
        },
        result: function (action, isNum) {
          var that = this;
          var data = that.data;
          if (isNum) {
            data.next = data.next === "0" ? action : data.next + action;
            !data.action && (data.total = 0);
          } else if (action === "清空") {
            // 请补充代码:设置清空时的对应状态
            data.total = 0;
            data.next = "";
            data.action = "";
          } else if (action === "=") {
            if (data.next || data.action) {
              data.total = that.calculate(data.total, data.next, data.action);
              data.next = "";
              data.action = "";
            }
          } else if (!data.next) {
            data.action = action;
          } else if (data.action) {
            data.total = that.calculate(data.total, data.next, data.action);
            data.next = "";
            data.action = action;
          } else {
            data.total = +data.next || 0;
            data.next = "";
            data.action = action;
          }

          // ���补充代码:获取 .origin-value 元素
          var valEl = document.querySelector(".origin-value");
          valEl && (valEl.innerHTML = data.next || data.total || "0");
        },
        calculate: function (n1, n2, operator) {
          n1 = +n1 || 0;
          n2 = +n2 || 0;
          if (operator === "÷") {
            // 请补充代码:获取除法的结果
            // n2在非零的情况下再次判断,如果结果含有小数点,并且小数点到最后一位长度大于2那就保留两位小数,反则直接返回结果
            return !n2
              ? 0
              : (n1 / n2 + "").includes(".") &&
                (n1 / n2 + "").slice((n1 / n2 + "").indexOf(".")).length > 2
              ? (n1 / n2).toFixed(2)
              : n1 / n2;
          } else if (operator === "x") {
            // 请补充代码:获取乘法的结果
            return !n2 ? 0 : n1 * n2;
          } else if (operator === "+") {
            // 请补充代码:获取加法的结果
            return n1 + n2;
          } else if (operator === "-") {
            // 请补充代码:获取减法的结果
            return n1 - n2;
          }
        },
      };
      Calculator.init();

发表于 2022-08-17 11:38:49 回复(1)
var Calculator = {
    init: function () {
        var that = this;
        if (!that.isInited) {
            that.isInited = true;
            // 保存操作信息
            // total: Number, 总的结果
            // next: String, 下一个和 total 进行运算的数据
            // action: String, 操作符号
            that.data = {total: 0, next: '', action: ''};
            that.bindEvent();
        }
    },
    bindEvent: function () {
        var that = this;
        // 请补充代码:获取 .cal-keyboard 元素
        var keyboardEl = document.querySelector('.cal-keyboard');
        keyboardEl && keyboardEl.addEventListener('click', function (event) {
            // 请补充代码:获取当前点击的dom元素
            var target = event.target;
            // 请补充代码:获取target的 data-action 值
            var action = target.getAttribute('data-action');
            // 或  target.dataset.action;
            // 请补充代码:获取target的内容
            var value = target.innerHTML;
            if (action === 'num' || action === 'operator') {
                that.result(value, action === 'num');
            }
        });
    },
    result: function (action, isNum) {
        var that = this;
        var data = that.data;
        if (isNum) {
            data.next = data.next === '0' ? action : (data.next + action);
            !data.action && (data.total = 0);
        } else if (action === '清空') {
            // 请补充代码:设置清空时的对应状态
            data.total = 0;
            data.next = '';
            data.action = '';
        } else if (action === '=') {
            if (data.next || data.action) {
                data.total = that.calculate(data.total, data.next, data.action);
                data.next = '';
                data.action = '';
            }
        } else if (!data.next) {
            data.action = action;
        } else if (data.action) {
            data.total = that.calculate(data.total, data.next, data.action);
            data.next = '';
            data.action = action;
        } else {
            data.total = +data.next || 0;
            data.next = '';
            data.action = action;
        }
    
        // ���补充代码:获取 .origin-value 元素
        var valEl = document.querySelector('.origin-value');
        valEl && (valEl.innerHTML = data.next || data.total || '0');
    },
    calculate: function (n1, n2, operator) {
        n1 = +n1 || 0;
        n2 = +n2 || 0;
        if (operator === '÷') {
            // 请补充代码:获取除法的结果
            let rs = n1/n2
            if (n2==0) rs=0
            return rs.toFixed(2)-0;
        } else if (operator === 'x') {
            // 请补充代码:获取乘法的结果
            return n1*n2.toFixed(2)-0;
        } else if (operator === '+') {
            // 请补充代码:获取加法的结果
            return (n1+n2).toFixed(2)-0;
        } else if (operator === '-') {
            // 请补充代码:获取减法的结果
            return n1-n2.toFixed(2)-0;
        }
    }
};
Calculator.init();

发表于 2022-07-27 10:44:41 回复(0)
var Calculator = {
    init: function () {
        var that = this;
        if (!that.isInited) {
            that.isInited = true;
            // 保存操作信息
            // total: Number, 总的结果
            // next: String, 下一个和 total 进行运算的数据
            // action: String, 操作符号
            that.data = {total: 0, next: '', action: ''};
            that.bindEvent();
        }
    },
    bindEvent: function () {
        var that = this;
        // 请补充代码:获取 .cal-keyboard 元素
        var keyboardEl = document.querySelector('.cal-keyboard');
        keyboardEl && keyboardEl.addEventListener('click', function (event) {
            // 请补充代码:获取当前点击的dom元素
            var target = event.target;
            // 请补充代码:获取target的 data-action 值
            var action = target.getAttribute('data-action');
            // 请补充代码:获取target的内容
            var value = target.innerHTML;
            if (action === 'num' || action === 'operator') {
                that.result(value, action === 'num');
            }
        });
    },
    result: function (action, isNum) {
        var that = this;
        var data = that.data;
        if (isNum) {
            data.next = data.next === '0' ? action : (data.next + action);
            !data.action && (data.total = 0);
        } else if (action === '清空') {
            // 请补充代码:设置清空时的对应状态
            data.total = 0;
            data.next = '';
            data.action = '';
        } else if (action === '=') {
            if (data.next || data.action) {
                data.total = that.calculate(data.total, data.next, data.action);
                data.next = '';
                data.action = '';
            }
        } else if (!data.next) {
            data.action = action;
        } else if (data.action) {
            data.total = that.calculate(data.total, data.next, data.action);
            data.next = '';
            data.action = action;
        } else {
            data.total = +data.next || 0;
            data.next = '';
            data.action = action;
        }
    
        // ���补充代码:获取 .origin-value 元素
        var valEl = document.querySelector('.origin-value');
        valEl && (valEl.innerHTML = data.next || data.total || '0');
    },
    calculate: function (n1, n2, operator) {
        n1 = +n1 || 0;
        n2 = +n2 || 0;
        if (operator === '÷') {
            // 请补充代码:获取除法的结果
            if(n2===0){
                return 0;
            }else{
                return /\.\w\w/.test(n1/n2)?parseFloat((n1/n2).toFixed(2)):n1/n2;
            }
        } else if (operator === 'x') {
            // 请补充代码:获取乘法的结果
            return n1*n2;
        } else if (operator === '+') {
            // 请补充代码:获取加法的结果
            var len = 0;
            if(/\./.test(n1) || /\./.test(n2)){
                len = String(n1).split('.')[1].length > String(n2).split('.')[1].length ? String(n1).split('.')[1].length : String(n2).split('.')[1].length;
            }
            
            return parseFloat((n1+n2).toFixed(len));
        } else if (operator === '-') {
            // 请补充代码:获取减法的结果
            return n1-n2;
        }
    }
};

发表于 2022-02-21 10:32:13 回复(0)

需要注意的是:使用 num.toFixed(2) 保留小数位数时,输出类型是 string 类型,并不是 number 类型(可使用 typeof 测试),需要转换为 number 类型,即Number()或者使用 ‘+’ 一元运算符

/**
 * @description
 * 本题展示了一个简化版的计算器,需求如下:
 * 1、除法操作时,如果被除数为0,则结果为0
 * 2、结果如果为小数,最多保留小数点后两位,如 2 / 3 = 0.67(显示0.67), 1 / 2 = 0.5(显示0.5)
 * 3、请阅读并根据提示补充完成函数initEvent、result和calculate
 * 4、请不要手动修改html和css
 * 5、不要使用第三方插件
 */
var Calculator = {
  init: function () {
    var that = this;
    if (!that.isInited) {
      that.isInited = true;
      // 保存操作信息
      // total: Number, 总的结果
      // next: String, 下一个和 total 进行运算的数据
      // action: String, 操作符号
      that.data = { total: 0, next: '', action: '' };
      that.bindEvent();
    }
  },
  bindEvent: function () {
    var that = this;
    // 请补充代码:获取 .cal-keyboard 元素
    var keyboardEl = document.querySelector('.cal-keyboard');
    keyboardEl && keyboardEl.addEventListener('click', function (event) {
      // 请补充代码:获取当前点击的dom元素
      var target = event.target;
      // 请补充代码:获取target的 data-action 值
      var action = target.dataset.action;
      // 请补充代码:获取target的内容
      var value = target.textContent;
      if (action === 'num' || action === 'operator') {
        that.result(value, action === 'num');
      }
    });
  },
  result: function (action, isNum) {
    var that = this;
    var data = that.data;
    if (isNum) {
      data.next = data.next === '0' ? action : (data.next + action);
      !data.action && (data.total = 0);
    } else if (action === '清空') {
      // 请补充代码:设置清空时的对应状态
      data.total = 0;
      data.next = '';
      data.action = '';
    } else if (action === '=') {
      if (data.next || data.action) {
        data.total = that.calculate(data.total, data.next, data.action);
        data.next = '';
        data.action = '';
      }
    } else if (!data.next) {
      data.action = action;
    } else if (data.action) {
      data.total = that.calculate(data.total, data.next, data.action);
      data.next = '';
      data.action = action;
    } else {
      data.total = +data.next || 0;
      data.next = '';
      data.action = action;
    }

    // 补充代码:获取 .origin-value 元素
    var valEl = document.querySelector('.origin-value');
    valEl && (valEl.innerHTML = data.next || data.total || '0');
  },
  calculate: function (n1, n2, operator) {
    n1 = +n1 || 0;
    n2 = +n2 || 0;
    if (operator === '÷') {
      // 请补充代码:获取除法的结果
      if (n2 === 0) {
        return 0
      }
      var total = n1 / n2;
      if (total.toString().split('.').length === 2) {
        total = total.toString().split('.')[1].length > 2 ? +total.toFixed(2) : total;
      }
      return total;
    } else if (operator === 'x') {
      // 请补充代码:获取乘法的结果
      return n1 * n2;
    } else if (operator === '+') {
      // 请补充代码:获取加法的结果
      return Math.floor((n1 + n2) * 100) / 100;
    } else if (operator === '-') {
      // 请补充代码:获取减法的结果
      return Math.ceil((n1 - n2) * 100) / 100;
    }
  }
};
Calculator.init();
发表于 2021-12-20 17:31:38 回复(0)
题目中的需求1 有错误,应改成:除法操作时,如果除数为0,则结果为0
var Calculator = {
    init: function () {
        var that = this;
        if (!that.isInited) {
            that.isInited = true;
            // 保存操作信息
            // total: Number, 总的结果
            // next: String, 下一个和 total 进行运算的数据
            // action: String, 操作符号
            that.data = {total: 0, next: '', action: ''};
            that.bindEvent();
        }
    },
    bindEvent: function () {
        var that = this;
        // 请补充代码:获取 .cal-keyboard 元素
        var keyboardEl = null;
        keyboardEl = document.querySelector('.cal-keyboard')
        keyboardEl && keyboardEl.addEventListener('click', function (event) {
            // 请补充代码:获取当前点击的dom元素
            var target = null;
            target = event.target
            // 请补充代码:获取target的 data-action 值
            var action = '';
            action = target.getAttribute("data-action")
            // 请补充代码:获取target的内容
            var value = '';
            value = target.innerText
            if (action === 'num' || action === 'operator') {
                that.result(value, action === 'num');
            }
        });
    },
    result: function (action, isNum) {
        var that = this;
        var data = that.data;
        if (isNum) {
            data.next = data.next === '0' ? action : (data.next + action);
            !data.action && (data.total = 0);
        } else if (action === '清空') {
            // 请补充代码:设置清空时的对应状态
            data.total = 0;
            data.next = '';
            data.action = '';
        } else if (action === '=') {
            if (data.next || data.action) {
                data.total = that.calculate(data.total, data.next, data.action);
                data.next = '';
                data.action = '';
            }
        } else if (!data.next) {
            data.action = action;
        } else if (data.action) {
            data.total = that.calculate(data.total, data.next, data.action);
            data.next = '';
            data.action = action;
        } else {
            data.total = +data.next || 0;
            data.next = '';
            data.action = action;
        }
    
        // ���补充代码:获取 .origin-value 元素
        var valEl = null;
        valEl = document.querySelector('.origin-value')
        valEl && (valEl.innerHTML = data.next || data.total || '0');
    },
    calculate: function (n1, n2, operator) {
        n1 = +n1 || 0;
        n2 = +n2 || 0;
        if (operator === '÷') {
            // 请补充代码:获取除法的结果
            const res = n1 / n2
            if (res !== Infinity) return +res.toFixed(2)
            return 0;
        } else if (operator === 'x') {
            // 请补充代码:获取乘法的结果
            return +(n1 * n2).toFixed(2);
        } else if (operator === '+') {
            // 请补充代码:获取加法的结果
            return +(n1 + n2).toFixed(2);
        } else if (operator === '-') {
            // 请补充代码:获取减法的结果
            return +(n1 - n2).toFixed(2);
        }
    }
};
Calculator.init();


发表于 2021-11-30 11:05:55 回复(0)
保留小数位我做
function to2Fixed(num) {
  return +num.toFixed(2);
}

太复杂了


发表于 2021-11-11 21:55:19 回复(0)
var Calculator = {
  init: function () {
    var that = this;
    if (!that.isInited) {
      that.isInited = true;
      // 保存操作信息
      // total: Number, 总的结果
      // next: String, 下一个和 total 进行运算的数据
      // action: String, 操作符号
      that.data = {total: 0, next: '', action: ''};
      that.bindEvent();
    }
  },
  bindEvent: function () {
    var that = this;
    // 请补充代码:获取 .cal-keyboard 元素
    var keyboardEl = document.querySelector(".cal-keyboard");
    keyboardEl && keyboardEl.addEventListener('click', function (event) {
      // 请补充代码:获取当前点击的dom元素
      var target = event.path[0];
      // 请补充代码:获取target的 data-action 值
      var action = target.dataset.action;
      // 请补充代码:获取target的内容
      var value = target.innerText;
      if (action === 'num' || action === 'operator') {
        that.result(value, action === 'num');
      }
    });
  },
  result: function (action, isNum) {
    var that = this;
    var data = that.data;
    if (isNum) {
      data.next = data.next === '0' ? action : (data.next + action);
      !data.action && (data.total = 0);
    } else if (action === '清空') {
      // 请补充代码:设置清空时的对应状态
      data.total = 0;
      data.next = "";
      data.action = "";
    } else if (action === '=') {
      if (data.next || data.action) {
        data.total = that.calculate(data.total, data.next, data.action);
        data.next = '';
        data.action = '';
      }
    } else if (!data.next) {
      data.action = action;
    } else if (data.action) {
      data.total = that.calculate(data.total, data.next, data.action);
      data.next = '';
      data.action = action;
    } else {
      data.total = +data.next || 0;
      data.next = '';
      data.action = action;
    }

    // ���补充代码:获取 .origin-value 元素
    var valEl = document.querySelector(".origin-value");
    valEl && (valEl.innerHTML = data.next || data.total || '0');
  },
  calculate: function (n1, n2, operator) {
    n1 = +n1 || 0;
    n2 = +n2 || 0;
    if (operator === '÷') {
      // 请补充代码:获取除法的结果
      // 【需求】1、除法操作时,如果被除数为0,则结果为0
      if(n2 === 0) return 0;
      n1 /= n2;
      // 【需求】2、结果如果为小数,最多保留小数点后两位,如 2 / 3 = 0.67(显示0.67), 1 / 2 = 0.5(显示0.5)
      if(String(n1).split(".")[1] && String(n1).split(".")[1].length > 2){
        n1 = n1.toFixed(2);
      }
      return n1 * 1;
    } else if (operator === 'x') {
      // 请补充代码:获取乘法的结果
      return n1 * n2;
    } else if (operator === '+') {
      // 请补充代码:获取加法的结果
      return Number((n1 + n2).toFixed(2));
    } else if (operator === '-') {
      // 请补充代码:获取减法的结果
      return Number((n1 - n2).toFixed(2));
    }
  }
};
Calculator.init();
发表于 2021-09-09 09:45:59 回复(0)
题目中的除号➗是emoji,做题的时候需要手动删除。
代码里用else来兜底,因为测试用例中又有除号
就很开心,牛客网v5!!
发表于 2021-08-06 12:21:23 回复(0)
始终内存超限!即使不修改任何东西进行提交也是内存超限
  var Calculator = {
    init: function () {
        var that = this;
        if (!that.isInited) {
            that.isInited = true;
            that.data = {total: 0next: ''action: ''};
            that.bindEvent();
        }
    },
    bindEvent: function () {
        var that = this;
        var keyboardEl = document.getElementsByClassName('cal-keyboard')[0];
        keyboardEl && keyboardEl.addEventListener('click'function (event) {
            var target = event.target;
            var value = target.innerHTML;
            var action = '';
            
            if(isNaN(value)){
               action = 'operator'
            } else {
                action = 'num'
            }
            if (action === 'num' || action === 'operator') {
                that.result(value, action === 'num');
            }
        });
    },
    result: function (action, isNum) {
        var that = this;
        var data = that.data;
        if (isNum) {
            data.next = data.next === '0' ? action : (data.next + action);
            !data.action && (data.total = 0);
        } else if (action === '清空') {
            data.total = 0;
            data.next = '';
            data.action = '';
        } else if (action === '=') {
            if (data.next || data.action) {
                data.total = that.calculate(data.total, data.next, data.action);
                data.next = '';
                data.action = '';
            }
        } else if (!data.next) {
            data.action = action;
        } else if (data.action) {
            data.total = that.calculate(data.total, data.next, data.action);
            data.next = '';
            data.action = action;
        } else {
            data.total = +data.next || 0;
            data.next = '';
            data.action = action;
        }
    
        var valEl = document.getElementsByClassName('origin-value')[0];
        valEl && (valEl.innerHTML = data.next || data.total || '0');
    },
    calculate: function (n1, n2, operator) {
        n1 = +n1 || 0;
        n2 = +n2 || 0;
        if (operator === '÷') {
            if(n2 == 0) {
              return 0;
            }
            return parseInt(n1/n2);
        } else if (operator === 'x') {
            return n1*n2;
        } else if (operator === '+') {
            return n1+n2;
        } else if (operator === '-') {
            return n1-n2;
        }
    }
};
Calculator.init();

编辑于 2021-06-29 16:54:49 回复(0)
内存超限,不知道怎么搞啊
发表于 2021-06-08 15:27:09 回复(0)
var Calculator = {
    init: function () {
        var that = this;
        if(!that.isInited) {
            that.isInited = true;
            // 保存操作信息
            // total: Number, 总的结果
            // next: String, 下一个和 total 进行运算的数据
            // action: String, 操作符号
            that.data = {total: 0, next: '', action: ''};
            that.bindEvent();
        }
    },
    bindEvent: function () {
        var that = this;
        // 请补充代码:获取 .cal-keyboard 元素
        var keyboardEl = document.getElementsByClassName('cal-keyboard')[0];
        keyboardEl && keyboardEl.addEventListener('click', function (event) {
            // 请补充代码:获取当前点击的dom元素
            var target = event.target;
            // 请补充代码:获取target的 data-action 值
            var action = event.srcElement.dataset.action
            // 请补充代码:获取target的内容
            var value = event.srcElement.innerHTML;
            if(action === 'num'|| action === 'operator') {
                that.result(value, action === 'num');
            }
        });
    },
    result: function (action, isNum) {
        var that = this;
        var data = that.data;
        if(isNum) {
            data.next = data.next === '0'? action : (data.next + action);
            !data.action && (data.total = 0);
        } elseif(action === '清空') {
            // 请补充代码:设置清空时的对应状态
            data.total = 0;
            data.next = '';
            data.action = '';
        } elseif(action === '=') {
            if(data.next || data.action) {
                data.total = that.calculate(data.total, data.next, data.action);
                data.next = '';
                data.action = '';
            }
        } elseif(!data.next) {
            data.action = action;
        } elseif(data.action) {
            data.total = that.calculate(data.total, data.next, data.action);
            data.next = '';
            data.action = action;
        } else{
            data.total = +data.next || 0;
            data.next = '';
            data.action = action;
        }
     
        // ���补充代码:获取 .origin-value 元素
        var valEl = document.getElementsByClassName('origin-value')[0];
        valEl && (valEl.innerHTML = data.next || data.total || '0');
    },
    calculate: function (n1, n2, operator) {
        n1 = +n1 || 0;
        n2 = +n2 || 0;
        if(operator === '÷') {
            // 请补充代码:获取除法的结果
            returnn2 == 0? 0: Math.round(n1 / n2 * 100) / 100;
        } elseif(operator === 'x') {
            // 请补充代码:获取乘法的结果
            returnMath.round(n1 * n2 * 100) / 100;
        } elseif(operator === '+') {
            // 请补充代码:获取加法的结果
            returnMath.round((n1 + n2) * 100) / 100;
        } elseif(operator === '-') {
            // 请补充代码:获取减法的结果
            returnMath.round((n1 - n2) * 100) / 100;
        }
    }
};
Calculator.init();


内存超限  始终没解决
发表于 2021-05-27 14:51:25 回复(0)
var Calculator = {
        init: function () {
          var that = this;
          if (!that.isInited) {
            that.isInited = true;
            // 保存操作信息
            // total: Number, 总的结果
            // next: String, 下一个和 total 进行运算的数据
            // action: String, 操作符号
            that.data = { total: 0next: ""action: "" };
            that.bindEvent();
          }
        },
        bindEvent: function () {
          var that = this;
          // 请补充代码:获取 .cal-keyboard 元素
          var keyboardEl = document.getElementsByClassName("cal-keyboard")[0];
          keyboardEl &&
            keyboardEl.addEventListener("click"function (event) {
              // 请补充代码:获取当前点击的dom元素
              var target = event.target;
              // 请补充代码:获取target的 data-action 值
              var action = target.dataset.action;
              // 请补充代码:获取target的内容
              var value = target.textContent;
              if (action === "num" || action === "operator") {
                that.result(valueaction === "num");
              }
            });
        },
        result: function (actionisNum) {
          var that = this;
          var data = that.data;
          if (isNum) {
            data.next = data.next === "0" ? action : data.next + action;
            !data.action && (data.total = 0);
          } else if (action === "清空") {
            // 请补充代码:设置清空时的对应状态
            data.total = 0;
            data.next = "";
            data.action = "";
          } else if (action === "=") {
            if (data.next || data.action) {
              data.total = that.calculate(data.totaldata.nextdata.action);
              data.next = "";
              data.action = "";
            }
          } else if (!data.next) {
            data.action = action;
          } else if (data.action) {
            data.total = that.calculate(data.totaldata.nextdata.action);
            data.next = "";
            data.action = action;
          } else {
            data.total = +data.next || 0;
            data.next = "";
            data.action = action;
          }

          // ���补充代码:获取 .origin-value 元素
          var valEl = document.getElementsByClassName("origin-value")[0];
          valEl &&
            (valEl.innerHTML = data.next || this.fixed(data.total) || "0");
        },
        fixed: function (numcount = 2) {
          return num?.toFixed(count).replace(/(?<=\..*)0*$/"");
        },

        calculate: function (n1n2operator) {
          n1 = +n1 || 0;
          n2 = +n2 || 0;
          if (operator === "÷") {
            // 请补充代码:获取除法的结果
            if (n2 === 0return 0;
            return n1 / n2;
          } else if (operator === "x") {
            // 请补充代码:获取乘法的结果
            return n1 * n2;
          } else if (operator === "+") {
            // 请补充代码:获取加法的结果
            return n1 + n2;
          } else if (operator === "-") {
            // 请补充代码:获取减法的结果
            return n1 + n2;
          }
        },
      };
      Calculator.init();

编辑于 2021-05-25 22:49:41 回复(0)
 var Calculator = {
    initfunction () {
        var that = this;
        if (!that.isInited) {
            that.isInited = true;
            // 保存操作信息
            // total: Number, 总的结果
            // next: String, 下一个和 total 进行运算的数据
            // action: String, 操作符号
            that.data = {total0next''action''};
            that.bindEvent();
        }
    },
    bindEventfunction () {
        var that = this;
        // 请补充代码:获取 .cal-keyboard 元素
        var keyboardEl = null;
        keyboardEl = document.getElementsByClassName("cal-keyboard")[0]//获取 .cal-keyboard 元素
        keyboardEl && keyboardEl.addEventListener('click'function (event) {
            // 请补充代码:获取当前点击的dom元素
            var target = null;
            target = event.target//获取当前点击的dom元素
            console.log("当前点击的对象:",target)
            // 请补充代码:获取target的 data-action 值
            var action = '';
            action = target.dataset.action;//获取target的 data-action 值
            console.log("action:",action)
            // 请补充代码:获取target的内容
            var value = '';
            value = target.innerHTML;//获取target的内容
            console.log("value:",value)
            if (action === 'num' || action === 'operator') {
                that.result(valueaction === 'num');
            }
        });
    },
    resultfunction (actionisNum) {
        var that = this;
        var data = that.data;
        if (isNum) {
            data.next = data.next === '0' ? action : (data.next + action);
            !data.action && (data.total = 0);
        } else if (action === '清空') {
            // 请补充代码:设置清空时的对应状态
            data.total = 0;
            data.next = '';
            data.action = null;
        } else if (action === '=') {
            if (data.next || data.action) {
                data.total = that.calculate(data.totaldata.nextdata.action);
                data.next = '';
                data.action = '';
            }
        } else if (!data.next) {
            data.action = action;
        } else if (data.action) {
            data.total = that.calculate(data.totaldata.nextdata.action);
            data.next = '';
            data.action = action;
        } else {
            data.total = +data.next || 0;
            data.next = '';
            data.action = action;
        }
    
        // 补充代码:获取 .origin-value 元素
        var valEl = null;
        valEl = document.getElementsByClassName("origin-value")[0]
        valEl && (valEl.innerHTML = data.next || data.total || '0');
        console.log("valEl:",valEl)
    },
    calculatefunction (n1n2operator) {
        n1 = +n1 || 0;
        n2 = +n2 || 0;
        if (operator === '÷') {
            // 请补充代码:获取除法的结果
            if(n2==0){
                return 0;
            }else{
                if((((n1/n2).toFixed(2)).toString()).split('.')[1]=='00'){
                    return (n1/n2).toFixed(0)
                }else if((n1/n2).toFixed(2).toString().split('.')[1].split('')[1]=='0'){
                  return (n1/n2).toFixed(1)
                }
                else{
                    return (n1/n2).toFixed(2)
                }
            }
        } else if (operator === 'x') {
            // 请补充代码:获取乘法的结果
            if((((n1*n2).toFixed(2)).toString()).split('.')[1]=='00'){
                    return (n1*n2).toFixed(0)
                }else if((n1*n2).toFixed(2).toString().split('.')[1].split('')[1]=='0'){
                  return (n1*n2).toFixed(1)
                }
                else{
                    return (n1*n2).toFixed(2)
                }
        } else if (operator === '+') {
            // 请补充代码:获取加法的结果
            return (n1+n2).toFixed(2);
        } else if (operator === '-') {
            // 请补充代码:获取减法的结果
            return (n1-n2).toFixed(2);
        }
    }
};
Calculator.init();
内存老是超出,莫得办法 
发表于 2021-05-20 22:18:20 回复(0)