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();
大佬看看哪里错误了,本地测试都好好的,就是通不过 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();
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();
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; } } };
需要注意的是:使用 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();
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();
function to2Fixed(num) { return +num.toFixed(2); }
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();转