在使用数字时,除了简单的加、减、乘、除运算外,还经常要用到复杂的数学函数,如三角函数、平方根运算等,在JavaScript中这些函数作为Math对象的方法提供。在数学运算中还经常用到一些常数,如欧拉常数、圆周率等,这些常数作为Math对象的属性提供。
Math对象是JavaScript中的一个全局对象,不需要由函数进行创建,而且只有一个。为了便于大家使用,表6.4和表6.5分别列出了Math对象的属性和方法。
表6.4 Math对象的属性
使 用 语 法 |
描 述 |
Math.E |
欧拉常数(e) |
Math.LN2 |
2的自然对数 |
Math.LN10 |
10的自然对数 |
Math.LOG2E |
以2为底e的对数 |
Math.LOG10E |
以10为底e的对数 |
Math.PI |
圆周率π |
Math.SQRT1_2 |
1/2的平方根 |
Math.SQRT2 |
2的平方根 |
表6.5 Math对象的方法
使 用 语 法 |
描 述 |
Math.abs(x) |
返回x的绝对值 |
Math.acos(x) |
返回x的反余弦,x介于-1和1之间,返回值介于0和π之间 |
Math.asin(x) |
返回x的反正弦,x介于-1和1之间,返回值介于-π/2和π/2之间 |
Math.atan(x) |
返回x的反正切,返回值介于-π/2和π/2之间 |
Math.atan2(y,x) |
返回y/x的反正切,这里的(x,y)是笛卡儿坐标值,返回值介于-π/2和π/2之间 |
Math.ceil(x) |
返回大于等于x的最小整数 |
Math.cos(x) |
返回x的余弦 |
Math.exp(x) |
返回E的x次幂 |
Math.floor(x) |
返回小于等于x的最大整数 |
Math.log(x) |
返回x的自然对数(以e为底) |
Math.max(value1,value2,…,valueN) |
返回参数列表中最大的一个值 |
Math.min(value1,value2,…,valueN) |
返回参数列表中最小的一个值 |
Math.pow(x,y) |
幂运算,返回以x为底,y为指数的幂 |
Math.random() |
返回一个0到1之间的随机小数,例如“0.47306810457174553” |
Math.round(x) |
将一个小数四舍五入为整数,例如:Math.round(3.5)返回4,但Math.round(-3.5)返回-3 |
续表
使 用 语 法 |
描 述 |
Math.sin(x) |
返回x的正弦值 |
Math.sqrt(x) |
返回x的平方根,x必须大于0 |
Math.tan(x) |
返回x的正切,x以弧度表示 |
通过Math对象属性和方法,可以完成各种类型的数学运算,本节将通过两个例子,详细说明它们的用法。
Math对象提供了一个进行四舍五入计算的函数:Math.round(x),实际上它等价于Math.floor(x+0.5)。但round函数仅能够将小数四舍五入为整数,而在实际开发中,经常需要四舍五入到指定位数,例如:金额信息通常需要保留两位小数。
要实现这个功能可用如下思想:将原有小数扩到10的指定次方倍数,再四舍五入,最后将小数恢复到原来的数量级。光盘文件6.4.htm实现了这种函数,代码如下。
<script language="JavaScript" type="text/javascript">
<!--
function roundTmp(x,y){
var _pow=Math.pow(10,y);
x*=_pow;
x=Math.round(x);
return x/_pow;
}
alert(roundTmp (56.456345654,2));
//-->
</script>
代码的最后,以“56.456345654”四舍五入到第2位小数为例说明了函数的执行,输出结果为 “56.46”。函数的执行过程为,56.456345654先被乘以100(10的2次方),得到5645.6345654。再对它调用 Math.round()函数进行四舍五入,得到5645.63,最后将这个数除以100,就得到了需要的结果。
随机函数可以返回一个0~1之间的小数,通过一定的处理可以用来返回各种形式的随机数,例如:Math.round(Math.random()*100),就返回一个0~100之间的随机整数;Math.round(Math.random()*100)+100,则返回100~200之间的随机整数。返回指定上限和下限随机整数的通用形式如下:
Math.round(Math.random()*elementsCount)+lowerBound
这里elementsCount表示要产生的随机整数的数目,lowerBound表示整数范围的下限。如果要在一个数组中随机取一个值,这种用法很常用。
在概率统计问题上也经常会用到随机数,同样可以使用Math.random()解决。例如一根木棒随机折成三段,它们能组成一个三角形的概率是多少?用概率论固然可以解答这个问题,但有时不能确定得到的答案是否正确。这时用JavaScript来模拟并得到近似答案,这样就可以验证答案是否正确了。
求解过程就是使用JavaScript不断模拟将一根木棒随机折成三段,看它们是否能组成三角形,最后用能组成三角形的次数除以总的次数,得到最终的结果。模拟的次数越多,得到的结果就越精确。
在实现过程中有两个需要考虑的核心问题,下面分别列出并解决:
(1)如何模拟木棒的折断。木棒的长度固定,可以假设其为l,而折成3段只需两个断点,因此执行两次Math.random()来得到断点的位置,这样就将木棒随机分为了三段,可以很容易获取每一段的长度。而模拟的次数则很容易通过for循环进行控制。
(2)如何判断是否能组成三角形。三角形的一个重要性质就是“两边之和大于第三边”。所以只要较短的两段大于第三段即可。在这个例子中,只要有一段的长度超过了0.5就说明不能组成三角形。
解决了上述两个问题,下面给出代码实现:
<script language="JavaScript" type="text/javascript">
<!--
var totalCount=10000;
var okCount=0;
for(var i=0;i<totalCount;i++){
var duan1=Math.random(); //得到第一个断点
var duan2=Math.random(); //得到第二个断点
var l1=Math.min(duan1, duan2); //得到第一段长度
var l2=Math.max(duan1, duan2)-l1; //得到第二段长度
var l3=1-l1-l2; //得到第三段长度
if(l1>=0.5 || l2>=0.5 || l3>=0.5)
continue; //只要有一边长超过0.5,说明不能组成三角形
okCount++;
}
alert(okCount/totalCount);
//-->
</script>
通过改变totalCount的值,可以很容易改变模拟执行的次数,模拟执行10000次得到的结果是0.2536,可见其概率约为1/4。事实上,通过概率论计算得到的精确结果正是1/4。尽管计算机模拟不能得到精确的结果,但它可以辅助验证理论结果的正确性。