本节设计一个简单的计算器,该计算器能够进行加、减、乘、除四则运算,以及连续运算、求余运算。如果发生被除数为零的错误,会给出错误提示。演示效果如图3所示。
图3 简单计算器
【提示】
在JavaScript中,把所有复杂的数学公式与运算都封装在Math对象中。该对象不需要实例化,在全局作用域中可以直接调用。
【示例1】求6除以5的整数值,则可以使用如下方法来实现:
var n = Math.round( 6 / 5 ); // 调用Math对象的round()方法 alert( n ); // 返回1
Math对象包含多个数学常量和数学运算方法,专业计算方法都是一些数学函数,如三角函数、指数对数计算、根幂计算等。在数学常规方法中,包括数值取值(如取整、取正)、随机数和数值比较。
【示例2】下面示例使用random()方法生成1~10之间的随机数(包括1和10)。
random()方法能够生成一个在0~1之间的随机数,不包括0和1。如果希望获取指定范围的随机数,可以使用如下公式:
number = Math.random()*total + first
其中total表示随机数的范围,而first表示可能最小的随机数。例如,生成10个从1~10之间的随机数,可以设计:
for( var i = 0; i < 10; i ++ ){
// 生成1~10之间的随机数(包括1和10),其中10表示随机数的范围,1表示随机数的起始值
var n = Math.random() * 10 + 1;
document.write( n + "<br />" ); // 输出随机数
}
如果生成整数随机数,可以使用floor()进行取整,但不可以使用ceil()、round()方法,因为它们会向上取值,导致超出指定范围。
for( var i = 0; i < 10; i ++ ){
var n = Math.floor(Math.random() * 10 + 1);
document.write( n + "<br />" );
}
如果希望生成10个在10~20之间的随机整数,不包括10和20,则可以使用如下代码:
for( var i = 0; i < 10; i ++ ){
var n = Math.floor(Math.random() * 9 + 11);
document.write( n + "<br />" );
}
其中数值9表示10~20之间的范围,而11表示随机数的可能最小值。
【操作步骤】
第1步,新建文档,保存为index.html,在页面设计计算器的页面结构,代码如下:
<div id="calculator"> <div id="calcu-head"> <h6>简单的计算器</h6> </div> <form name="calculator" action="" method="get"> <div id="calcu-screen"> <!--配置显示窗口,使用onfocus="this.blur();"避免键盘输入--> <input type="text" name="numScreen" class="screen" value="0" onFocus="this.blur();"> </div> <div id="calcu-btn"> <ul> <!--配置按键--> <li onClick="command(7)">7</li> <li onClick="command(8)">8</li> <li onClick="command(9)">9</li> <li class="tool" onClick="del()">←</li> <li class="tool" onClick="clearscreen()">C</li> <li onClick="command(4)">4</li> <li onClick="command(5)">5</li> <li onClick="command(6)">6</li> <li class="tool" onClick="times()">×</li> <li class="tool" onClick="divide()">÷</li> <li onClick="command(1)">1</li> <li onClick="command(2)">2</li> <li onClick="command(3)">3</li> <li class="tool" onClick="plus()">+</li> <li class="tool" onClick="minus()">-</li> <li onClick="command(0)">0</li> <li onClick="dzero()">00</li> <li onClick="dot()">.</li> <li class="tool" onClick="persent()">%</li> <li class="tool" onClick="equal()">=</li> </ul> </div> </form> </div>
第2步,使用CSS设计计算器的界面效果,详细样式代码就不再显示,读者可以参阅光盘示例代码,效果如图4所示。
图4 设计界面结构效果
第3步,在页面头部位置插入<script type="text/javascript">,然后定义6个初始变量。
var num = 0, result = 0, numshow = "0"; var operate = 0;//判断输入状态的标志 var calcul = 0;//判断计算状态的标志 var quit = 0;//防止重复按键的标
第4步,定义运算按键的响应函数,设计当点击运算按键时准备执行的动作。最后,需要把这些函数分别绑定到对应按键的标签上。
function del() {//退格
var str = String(document.calculator.numScreen.value);
str = (str != "0") ? str : "";
str = str.substr(0, str.length - 1);
str = (str != "") ? str : "0";
document.calculator.numScreen.value = str;
}
function clearscreen() {//清除数据
num = 0;
result = 0;
numshow = "0";
document.calculator.numScreen.value = "0";
}
function plus() {//加法
calculate(); //调用计算函数
operate = 1; //更改输入状态
calcul = 1; //更改计算状态为加
}
function minus() {//减法
calculate();
operate = 1;
calcul = 2;
}
function times() {//乘法
calculate();
operate = 1;
calcul = 3;
}
function divide() {//除法
calculate();
operate = 1;
calcul = 4;
}
function persent() {//求余
calculate();
operate = 1;
calcul = 5;
}
function equal() { //等于
calculate();
operate = 1;
num = 0;
result = 0;
numshow = "0";
}
第5步,在数字按键标签上绑定一个命令函数command(num),该函数将根据按键显示的值,把该值复制到文本框中进行显示,并做好计算准备。
function command(num) {
var str = String(document.calculator.numScreen.value); //获得当前显示数据
//如果当前值不是"0",且状态为0,则返回当前值,否则返回空值;
str = (str != "0") ? ((operate == 0) ? str : "") : "";
str = str + String(num); //给当前值追加字符
document.calculator.numScreen.value = str; //刷新显示
operate = 0; //重置输入状态
quit = 0; //重置防止重复按键的标志
}
第6步,设计计算函数,该函数将检测设置条件,以及计算类型,执行计算操作。
function calculate() {
numshow = Number(document.calculator.numScreen.value);
if (num != 0 && quit != 1) {//判断前一个运算数是否为零以及防重复按键的状态
switch(calcul) { //判断要输入状态
case 1:
result = num + numshow;
break;
//计算"+"
case 2:
result = num - numshow;
break;
//计算"-"
case 3:
result = num * numshow;
break;
case 4:
if (numshow != 0) {
result = num / numshow;
} else {
document.getElementById("note").innerHTML = "被除数不能为零!";
setTimeout(clearnote, 4000)
}
break;
case 5:
result = num % numshow;
break;
}
quit = 1; //避免重复按键
} else {
result = numshow;
}
numshow = String(result);
document.calculator.numScreen.value = numshow;
num = result; //存储当前值
}