HTML版计算器 - Go语言中文社区

HTML版计算器


<html>
<head>
	<title>calculate</title>
	<style type="text/css">
	.bg{
		width:30%;
		height:450px;
		background:rgb(168,168,168);
		margin-left:35%;
		margin-right:35%;/*设置计算器居中*/
	}
	.uup{
		width:100%;
		height:9%;
		text-align:"center";
	}
	.up{
		width:88%;
		height:12%;
		border:solid 1px black;
		margin:3% 6% 1.5% 6%;/*上右下左*/
	}
	.down{
		width:88%;
		height:70%;
		border:solid 1px black;
		margin:1.5% 6% 3% 6%;
	}
	.logo{
		width:36%;
		height:100%;
		margin-top:0px;
		margin-left:0px;/*边距*/
		padding-left:30px;/*div与内容距离*/
		background-color:white;
		font-size:28px;
	}
	.show{
		width:100%;
		height:100%;
	}
	.numtable{
		width:90%;
		height:90%;
		margin:5%;
	}
	.numtable  tr td{
		width:25%;
		height:20%;/*设置每个表格大小一样*/
	}
	.numtable input{
		width:80%;
		height:80%;
		margin:10%;/*使按钮在表格中居中显示*/
	}

	</style>
	<script type="text/javascript">
			window.onload=initZero;
	var str = new Array();//保留输入字符数组
	var numStr = new Array();//数字栈
	var charStr = new Array();//运算符栈
	var flag = new Array();//负数标志位,true表示负数,与运算符栈相等
	var buttonId = new Array("reset","plus","minus","del","num7","num8","num9","multiply","num4","num5","num6","divide","num1","num2","num3","point","leftbracket","num0","rightbracket","equal");
	//按钮ID名
	function $(id){
		return document.getElementById(id);
	}
	function initZero(){
		$("inputframe").value=0;//结果显示框清零
		initCE();//保存数据的栈和数组“清空”
		addListener();//为每个按钮添加click事件监听器
	}
	function initCE(){
		while(str.length!=0){
			str.pop();//删除数组最后一个元素
		}
		while(numStr.length!=0){
			numStr.shift();//删除数组第一个元素
		}
		while(charStr.length!=0){
			charStr.shift();//删除数组第一个元素
		}	
		while(flag.length!=0){
			flag.shift();
		}
		charStr[0] = "0";//运算符栈先插入一个优先级最低的“0”元素
		flag[0] = false;
	}
	function addListener(){
		for (var i=0; i<buttonId.length; i++){
			$(buttonId[i]).addEventListener("click",function(){//为每个按钮添加click事件监听器
				if(this.id == "equal"){//如果按下”=“按钮
					var result = getResult();
					/*if (isNaN(result)){
						alert("输入有错误!");
					}else{//numStr[0]位结果,按下equal时不清空*/
						if(str.length==0){
							$("inputframe").value = 0;
						}else{
							$("inputframe").value = showStr() + "=" + result;
							initCE();
						}
				}else if(this.id == "reset"){
					initCE();//如果按下“CE”,进行复位,数字栈,运算符栈清空并插入“0”元素
					$("inputframe").value = "0";//显示结果框清空
				}else if(this.id == "del"){
					str.pop();//按下“del”,撤回
					$("inputframe").value = showStr();	
				}else{//如果按下其他运算符和数字按钮,插入str数组中
					str.push(this.value);
					$("inputframe").value = showStr();//显示结果框中数字随着按钮按下不断增加
				}
			});
		}
	}
	function mul(num1,num2){//JavaScript存在小数计算精度丢失的问题,通过升级降级移动小数点解决
		var pointNum1 = 0;
		var pointNum2 = 0;
		var numStr1 = num1.toString();
		var numStr2 = num2.toString();
		if(numStr1.indexOf(".",0)!=-1){
			pointNum1 = numStr1.length-numStr1.indexOf(".",0)-1;//小数点个数
			num1 = Number(numStr1.replace(".",""));//移动小数点将实数升级
		}
		if(numStr2.indexOf(".",0)!=-1){
			pointNum2 = numStr2.length-numStr2.indexOf(".",0)-1;
			num2 = Number(numStr2.replace(".",""));
		}
		var pointNum = pointNum1+pointNum2;//运算结果小数点个数
		var resStr = (num1*num2).toString();
		if(pointNum!=0){
			if(resStr.length>pointNum){//升级后运算结果位数比小数点位数多
				var num = resStr.length-pointNum;
				var sstr = resStr.split("");
				resStr="";
				for(var i=0;i<num;i++){
					resStr = resStr.concat(sstr[i]);
				}	
				resStr = resStr.concat(".");
				for(var i=num;i<sstr.length;i++){
					resStr = resStr.concat(sstr[i]);
				}
			}else{
				var zero = "0";
				var point = ".";
				var num = pointNum-resStr.length+2;
				for(var i=0;i<num;i++){
					if(i==num-2){
						resStr = point.concat(resStr);
					}else{
						resStr = zero.concat(resStr);					
					}
				}
			}
		}
		return Number(resStr);
	}
	function div(num1,num2){
		var pointNum1 = 0;
		var pointNum2 = 0;
		var numStr1 = num1.toString();
		var numStr2 = num2.toString();
		if(numStr1.indexOf(".",0)!=-1){
			pointNum1 = numStr1.length-numStr1.indexOf(".",0)-1;
			num1 = Number(numStr1.replace(".",""));
		}
		if(numStr2.indexOf(".",0)!=-1){
			pointNum2 = numStr2.length-numStr2.indexOf(".",0)-1;
			num2 = Number(numStr2.replace(".",""));
		}		
		var resStr = num2/num1;
		
		var pointNum = pointNum1>pointNum2?pointNum1-pointNum2:pointNum2-pointNum1;
		var pointSum = 1;
		if(pointNum!=0){
			for(var i = 0; i< pointNum; i++){
				pointSum = pointSum*10;
			}
			resStr = resStr/pointSum;
		}
		return resStr;
	}
	function charRes(num1, num2, ch){//根据表达式返回运算结果
		var res = 0;
		switch(ch){
			case "+":res = num2+num1;break;
			case "-":res = num2-num1;break;
			//case "*":res = num2*num1;break;
			case "*":res = mul(num1,num2);break;
			//case "/":res = num2/num1;break;
			case "/":res = div(num1,num2);break;
		}
		//JavaScript存在小数计算精度丢失的问题
		return res;
	}
	function charNum(str){//为每个运算符指定数组下标
		var num = 0;
		switch(str){
			case "+":num = 0;break;
			case "-":num = 1;break;
			case "*":num = 2;break;
			case "/":num = 3;break;
			case "(":num = 4;break;
			case ")":num = 5;break;
			case "0":num = 5;break;
		}
		return num;
	}
	function judgePriority(str1,str2){
		//通过operator二维数组的值,判断运算符优先级,大于零表示str1优先级大,
		//等于零表示遇到括号,小于零表示str2优先级大
		var operator = new Array(6);
		operator[0] = new Array(-1,-1,1,1,1,0);
		operator[1] = new Array(-1,-1,1,1,1,0);
		operator[2] = new Array(-1,-1,-1,-1,1,0);
		operator[3] = new Array(-1,-1,-1,-1,1,0);
		operator[4] = new Array(1,1,1,1,1,0);
		operator[5] = new Array(1,1,1,1,1,0);
		//下面为二位数组的格式
		/*   + - x / ( )
		   + 
		   -
		   X
		   /
		   (
		   0
		*/
		var i = charNum(str1);
		var j = charNum(str2);
		return operator[i][j];

	}
	function getResult(){//返回总运算结果
		var j = 0;
		var finalNum = "";//将数字分离出来
		var fflag;
		for(var i=0; i<str.length; i++){
			finalNum = "";
			fflag = false;
			if(!isNaN(str[i])){//如果是数字,可能是多位
				j = i+1;
				while(j<str.length){//找到可能是多位数字的最后一位,j-1位最后一位
					if(!isNaN(str[j])){//是数字
						j++;
					}else if(str[j]=="."){
						j++;
					}else{
						break;
					}
				}
				for (m=i; m<j; m++){//将纯数字字符串分离出来
					finalNum += str[m];
				}		
				numStr.unshift(Number(finalNum));//操作数入numStr栈
				i = j-1;
			}
			else{
				//负数只有下面两种情况
				if(str[i]=="-"){
					if(i==0){//如果为-6+4*3
						fflag=true;
					}else {
						if(str[i-1]=="("){//如果为5+(-6-2)
							fflag=true;//flag=true代表为负数	
						}else{
							fflag=false;
						}	
					}
				}
				//alert("flag:"+flag);
				if(judgePriority(charStr[0],str[i]) > 0){//前面优先级大,则入charStr栈
					charStr.unshift(str[i]);
					flag.unshift(fflag);
				}else{	
					var ch = charStr.shift();
					if(judgePriority(charStr[0],str[i]) == 0){//当碰到右括号时
						while(ch!="("){
							var num1 =  numStr.shift();
							if(ch=="-" && flag[0]==true){
								numStr.unshift(0);
							}
							flag.shift();
							var num2 = numStr.shift();
							//alert("two:" + charRes(num1,num2,ch));							
							numStr.unshift(charRes(num1,num2,ch));//并将新的操作数入numStr栈	
							ch = charStr.shift();//直到弹出左括号
                        
                        
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_36336003/article/details/80489706
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-08 16:19:38
  • 阅读 ( 837 )
  • 分类:前端

0 条评论

请先 登录 后评论

官方社群

GO教程

推荐文章

猜你喜欢