operator(params){switch(params){case"clear"://清空this.showValue="0";break;case"opposite"://改变正负//负负得正this.showValue=-this.showValue;break;case"percent"://除以100this.showValue=this.showValue/100;break;case"":break;}},代码写完之后,来看一下效果:
在本次运行中,发现了很多问题,但是我们一一来解决就好,首选来看除以100,这个小数位错误的问题,其实是精度丢失。
丢失精度了我这里不测试了,大家可以将除以100的结果用console.log打印到控制台看一下,我这里直接给出解决方案,我在网上找了一个a-calc的库,用它,就可以帮我解决这个问题。
打开资源管理器之后:
再弹出来的终端当中输入如下安装指令即可进行安装:
导入a-calc:
import{calc,fmt}from"a-calc"然后使用calc包裹一下,就可以解决精度丢失的问题了,calc的参数是字符串,所以我们需要将this.showValue转换为字符串,代码如下:
this.showValue=calc(`${this.showValue}/100`);这样就可以解决精度丢失的问题了,来看一下效果:
嗯,到这基本上解决完毕了,接下来来看加减乘除,首先来看一个做加减乘除之前所需要解决的问题,如下图:
我按下的是23+65,应该在我按下+的时候将23记录下来,再将本次的运算符记录下来,然后再将65记录下来,最后再将23+65的结果记录下来,这样就可以了。
所以我还需要在改动一下代码,我分别新增了三个变量,分别是:
firstValue保存运算前面的数据,例如:1+2,保存1secondValue保存运算后面的数据,例如:1+2,保存2operatorType保存运算符,例如:1+2,保存+
我在额外定义一个变量isCaculate,用来记录用户,是否点击过运算符。
firstValue:"",secondValue:"",operatorType:"",isCaculate:false,需要的内容都定义完毕之后,来改造一下代码,首先在operator方法中,计算操作符的时候,需要将isCaculate设置为true,每次输入了运算符记录一下状态:
if(this.isCaculate){this.firstValue=this.showValue;this.showValue="0";this.isCaculate=false;}运行一下,看一下效果:
很完美,接下来就是计算的逻辑了,首先来看=,=的params是result所以在switch处理一下case为result的情况,因为这里设计到计算所以我单独抽取一个方法来完成这件事情,方法名叫caculate,写到这我突然忘记一个事情就是要保存我们的运算符,所以我在operator方法中,将运算符保存到operatorType中,不能直接保存,而是在default中保存,
caculate(){switch(this.operatorType){case"plus":this.showValue=calc(`${this.firstValue}+${this.showValue}`);break;case"minus":this.showValue=calc(`${this.firstValue}-${this.showValue}`);break;case"multiply":this.showValue=calc(`${this.firstValue}*${this.showValue}`);break;case"divide":this.showValue=calc(`${this.firstValue}/${this.showValue}`);break;case"":break;}},计算逻辑写完之后,来看一下效果:
这里还有个效果需要实现一下就是,我首先输入12然后按+,在输入12,然后按+,这时候我需要进行一次计算,因为我按了两次+,所以在第二次按+的时候,需要将第一次的计算结果进行计算,所以我在operator方法中,需要判断一下,如果firstValue不为空,那么就调用caculate方法,在default分支调用caculate方法,代码如下: