发布时间:2019-07-29 16:54:19
首先,由于JS的存在数值的精度误差问题:
0.1+0.2 //0.300000000000000040.3-0.1 //0.19999999999999998
所以在编写计算器是应首先解决计算精度问题,以下四个代码段分别是js中精确的加减乘除运算函数
//浮点数加法运算function floatAdd(arg1,arg2){var r1,r2,m;try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}m=Math.pow(10,Math.max(r1,r2));return (arg1*m+arg2*m)/m}
//浮点数减法运算function floatSub(arg1,arg2){ var r1,r2,m,n; try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0} try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0} m=Math.pow(10,Math.max(r1,r2)); //动态控制精度长度 n=(r1>=r2)?r1:r2; return ((arg1*m-arg2*m)/m).toFixed(n);}
//浮点数乘法运算function floatMul(arg1,arg2){ var m=0,s1=arg1.toString(),s2=arg2.toString(); try{m+=s1.split(".")[1].length}catch(e){} try{m+=s2.split(".")[1].length}catch(e){} return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)}
//浮点数除法运算function floatDiv(arg1,arg2) { var t1 = 0, t2 = 0, r1, r2; try {t1 = arg1.toString().split(".")[1].length} catch (e) {} try {t2 = arg2.toString().split(".")[1].length} catch (e) {} with (Math) { r1 = Number(arg1.toString().replace(".", "")); r2 = Number(arg2.toString().replace(".", "")); return (r1 / r2) * pow(10, t2 - t1); }}
以下是详细的计算器代码: HTML5
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>简单计算器</title><link href="main.css" rel="stylesheet"></head><body><div id="calculator"><div id="calculator_container"><h3>计算器</h3><table id="calculator_table"><tbody><tr><td colspan="5"><input type="text" id="resultIpt" readonly="readonly" value="" size="17" maxlength="17" style="width:294px;color: black"></td></tr><tr><td><input type="button" value="←" class="btn_color1 btn_operation"></td><td><input type="button" value="全清" class="btn_color1 btn_operation"></td><td><input type="button" value="清屏" ></td><td><input type="button" value="﹢/﹣" class="btn_color2 btn_operation"></td><td><input type="button" value="1/×" class="btn_color2 btn_operation"></td></tr><tr><td><input type="button" value="7" class="btn_color3 btn_number"></td><td><input type="button" value="8" class="btn_color3 btn_number"></td><td><input type="button" value="9" class="btn_color3 btn_number"></td><td><input type="button" value="÷" class="btn_color4 btn_operation"></td><td><input type="button" value="%" class="btn_color2 btn_operation"></td></tr><tr><td><input type="button" value="4" class="btn_color3 btn_number"></td><td><input type="button" value="5" class="btn_color3 btn_number"></td><td><input type="button" value="6" class="btn_color3 btn_number"></td><td><input type="button" value="×" class="btn_color4 btn_operation"></td><td><input type="button" value="√" class="btn_color2 btn_operation"></td></tr><tr><td><input type="button" value="1" class="btn_color3 btn_number"></td><td><input type="button" value="2" class="btn_color3 btn_number"></td><td><input type="button" value="3" class="btn_color3 btn_number"></td><td><input type="button" value="-" class="btn_color4 btn_operation"></td><td rowspan="2"><input type="button" value="=" class="btn_color2" style="height: 82px" id="simpleEqu"></td></tr><tr><td colspan="2"><input type="button" value="0" class="btn_color3 btn_number" style="width:112px"></td><td><input type="button" value="." class="btn_color3 btn_number" ></td><td><input type="button" value="+" class="btn_color4 btn_operation"></td></tr></tbody></table></div></div><script type="text/javascript" src="calculator.js"></script></body></html>
CSS3
* {margin: 0;padding: 0;}#calculator{position: relative;margin: 50px auto;width: 350px;height: 400px;border: 1px solid gray;-webkit-border-radius: 10px;-moz-border-radius: 10px;border-radius: 10px;-webkit-box-shadow: 2px 2px 4px gray;-moz-box-shadow: 2px 2px 4px gray;box-shadow: 2px 2px 4px gray;behavior:url("ie-css3.htc"); /*IE8-*/}#calculator_table{position: relative;margin: 10px auto;border-collapse:separate;border-spacing:10px 20px;}h3{position: relative;width: 60px;height: 30px;margin: 0 auto;}#calculator_table td{width: 50px;height: 30px;border: 1px solid gray;-webkit-border-radius: 2px;-moz-border-radius: 2px;border-radius: 2px;behavior:url("ie-css3.htc"); /*IE8-*/}#calculator_table td input{font-size: 16px;border: none;width: 50px;height: 30px;color: white;}input.btn_color1{background-color: orange;}input.btn_color2{background-color: #133645;}input.btn_color3{background-color: #59807d;}input.btn_color4{background-color: seagreen;}input:active{-webkit-box-shadow: 3px 3px 3px gray;-moz-box-shadow: 3px 3px 3px gray;box-shadow: 3px 3px 3px gray;behavior:url("ie-css3.htc"); /*IE8-*/}
JS
window.onload=function() {var resultIpt = document.getElementById("resultIpt"); //获取输出文本框var btns_number = document.getElementsByClassName("btn_number"); //获取数字输入按钮var btns_operation = document.getElementsByClassName("btn_operation"); //获取操作按钮var simpleEqu = document.getElementById("simpleEqu"); //获取"="按钮var temp = "";var num1= 0,num2=0;//获取第一个数for(var i=0;i<btns_number.length;i++){btns_number[i].onclick=function (){temp += this.value;resultIpt.value = temp;};}//对获取到的数进行操作for(var j=0;j<btns_operation.length;j++) {btns_operation[j].onclick = function () {num1=parseFloat(resultIpt.value);oper = this.value;if(oper=="1/×"){num1 = Math.pow(num1,-1); //取倒数resultIpt.value = num1.toString();}else if(oper=="﹢/﹣"){ //取相反数num1 = -num1;resultIpt.value = num1.toString();}else if(oper=="√"){ //取平方根num1 =Math.sqrt(num1);resultIpt.value = num1.toString();}else if(oper=="←"){ //删除个位resultIpt.value = resultIpt.value.substring(0, resultIpt.value.length - 1);}else if(oper=="全清"){ //清除数字resultIpt.value = "";}else{ //oper=="+" "-" "×" "÷" "%"时,继续输入第二数字temp = "";resultIpt.value = temp;}}}//输出结果simpleEqu.onclick=function(){num2=parseFloat(temp); //取得第二个数字calculate(num1, num2, oper);resultIpt.value = result.toString();}};//定义一个计算函数function calculate(num1, num2, oper) {switch (oper) {case "+":result=floatAdd(num1, num2); //求和break;case "-":result=floatSub(num1, num2); //求差break;case "×":result=floatMul(num1, num2); //求积break;case "÷":result=floatDiv(num1, num2); //求商break;case "%":result=num1%num2; //求余数break;}}//精确计算//浮点数加法运算function floatAdd(arg1,arg2){var r1,r2,m;try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}m=Math.pow(10,Math.max(r1,r2));return (arg1*m+arg2*m)/m}//浮点数减法运算function floatSub(arg1,arg2){var r1,r2,m,n;try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}m=Math.pow(10,Math.max(r1,r2));//动态控制精度长度n=(r1>=r2)?r1:r2;return ((arg1*m-arg2*m)/m).toFixed(n);}//浮点数乘法运算function floatMul(arg1,arg2){var m=0,s1=arg1.toString(),s2=arg2.toString();try{m+=s1.split(".")[1].length}catch(e){}try{m+=s2.split(".")[1].length}catch(e){}return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)}//浮点数除法运算function floatDiv(arg1,arg2) {var t1 = 0, t2 = 0, r1, r2;try {t1 = arg1.toString().split(".")[1].length} catch (e) {}try {t2 = arg2.toString().split(".")[1].length} catch (e) {}with (Math) {r1 = Number(arg1.toString().replace(".", ""));r2 = Number(arg2.toString().replace(".", ""));return (r1 / r2) * pow(10, t2 - t1);}}