Math类

          大家好。这是我的第一篇博文,其实是我的老师布置的作业。好吧,闲话少说,下面进入正题。我学的是JAVA,所以就来说说JAVA中的Math类吧。Math类在编程中常被用于计算商业驱动程序、动态显示布局、用于游戏界面/功能的随机活动,以及程序需要的代数和三角函数功能。高级的数学计算需要使用到函数和常量方程。Math类包含了各种方法和常量,用于协助解决数学计算。阅读完本章,你将非常轻松自如地使用Math类。

        使用Math类不仅仅是进行加减乘除。Math的各种方法和常量可以进行算数和三角计算,以及产生随机数。这些方法和常量与计算器上的按键很相似,比如正弦、正切和 。Math类是一个静态类,因此不必声明一个Math类的对象再使用其方法和常量。不必使用new创建一个类对象注册成为类成员,而只需要在类本身调用方法或属性即可,就像这样:Math. method();或Math.CONSTANT;。Math类同时也包括不会改变的静态常量,比如PI(3.141592653589793)和E(2.71828182845905)。可以在Flash的帮助文档中查询"Math class"查看。

Math类基本方法

1.       Math.abs(int a):返回值的绝对值。参数可以的类型int 、float、double、long

2.       Math.acos(double a):返回角的反余

3.       Math.asin(double a):返回角的反正弦。

4.       Math.atan(double a):返回角的反正切。

5.       Math.atan2(double a):将矩形坐标(x,y)转换成极坐标(r,theta)。

6.       Math.cbrt(double a):返回double 值的立方根。

7.       Math.ceil(double a):返回最小的(最接近负无穷大)double值,该值大于或等于参数,并且等于某个整数。

8.       Math.cos(double a):返回角的三角余弦。

9.       Math.cosh(double x):返回double 值的双曲线余弦。

10.   Math.exp(double a):返回欧拉数e 的double 次幂的值。

11.   Math.floor(double a):返回最大的(最接近正无穷大)double 值,该值小于或等于参数,并且等于某个整数。

12.   Math.max(int a,int b):返回两个值中较大的一个值。参数包含的类型 int、float、long、double。

13.   Math.min(int a,int b):返回两个值中较小的一个值。参数包含的类型 int、float、long、double。

14.   Math.random():返回带正号的double值。

15.   Math.round(double a):返回最接近参数的long。

16.   Math.round(float a):返回最接近参数的int。

Math类的误区

性能测试:
var num:Number = Math.PI;
var length:int = 10000000;
var time:int = getTimer();
for(var i:int = 0; i < length; i ++){
    Math.floor(num);
}
trace(getTimer() - time);
// 结果:1865
var num:Number = Math.PI;
var length:int = 10000000;
var time:int = getTimer();
for(var i:int = 0; i < length; i ++){
    int(num);
}
trace(getTimer() - time);
// 结果:69
结果很明显,int比floor快,可能大家就要说了,那Adobe傻X写个这样接口干什么?其实这就是我想说的对于floor的使用误区。
仔细看官方解释,其实floor不是一个真正我们所理解的取整函数,他是去找最接近自己,且比自己小或者等于的整数,那这是什么意思呢?
var num:Number = - Math.PI;
trace(int(num));
trace(Math.floor(num));
// 结果1:-3
// 结果2:-4
这个例子很明确表示,当目标数字是负数时,int和floor所得出的结果不一样。
int()的官方解释
将给定数字值转换成整数值。 从小数点处截断十进制值。
相信看到这,你已经很明白了。
但是实际上,如果你这样去使用int(),跟floor输出的结果相同:
var num:Number = - Math.PI;
var length:int = 10000000;
var time:int = getTimer();
for(var i:int = 0; i < length; i ++){
    if(num < 0){
        int(num) - 1;
    }else{
        int(num);
    }
}
trace(getTimer() - time);
// 结果:132
 
2、Math.pow()
对于这个方法,我也不知道说什么好了,先看性能测试吧:
var a:int = 3;
var b:int = 4;
var c:int = 5;
var length:int = 10000000;
var time:int = getTimer();
for(var i:int = 0; i < length; i ++){
    c * c == a * a + b * b;
}
trace(getTimer() - time);
// 结果:95
var a:int = 3;
var b:int = 4;
var c:int = 5;
var length:int = 10000000;
var time:int = getTimer();
for(var i:int = 0; i < length; i ++){
    Math.pow(c,2) == Math.pow(a,2) + Math.pow(b,2);
}
trace(getTimer() - time);
// 结果:7999
勾三股四弦五大家应该比较多,但是用"*"乘法运算和pow的性能比较那是非常明显啊。
难道大家又想说Adobe傻逼了?这儿我为它平反吧。
var num:Number = Math.PI;
var length:int = 10000000;
var time:int = getTimer();
for(var i:int = 0; i < length; i ++){
    Math.pow(num,10000);
}
trace(getTimer() - time);
// 结果:6682
先不说"*"乘法运算比pow快,就上面这段你能把它换算成使用"*"乘法运算吗?
而且pow其实是可以这样用的:(数学学得好都知道开方其实是可以转换成乘方来算的)
trace(Math.pow(27,1/3));
trace(Math.pow(256,1/4));
trace(Math.pow(3125,1/5));
而开方函数Adobe只提供了sqrt一个开平方根的接口(经测试Math.sqrt(9)比Math.pow(9,1/2)快,但开立方等就得靠pow了)。
 
3、Math.round()
这个方法跟floor一样的,先看性能测试:
var num:int = Math.PI;
var length:int = 10000000;
var time:int = getTimer();
for(var i:int = 0; i < length; i ++){
    Math.round(num);
}
trace(getTimer() - time);
// 结果:1931
var num:int = Math.PI;
var length:int = 10000000;
var time:int = getTimer();
for(var i:int = 0; i < length; i ++){
    int(num + 0.5)
}
trace(getTimer() - time);
// 结果:68
四舍五入其实加个0.5在取整,这样也是可以的,只不过用这个算法,存在跟第一个同样的问题,当目标数值为负时,两种方式结果不一样,需要加个判断,目标数值为负就把结果。

     就到这吧,其实我也是上网找的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值