本文共 3559 字,大约阅读时间需要 11 分钟。
AS3 数字取整方法
2011 年 03 月 27 日 No Comments int()去掉小数点 trace(int(3.14)); //输出3 trace(int(-3.14)); //输出-3 Math.round()方法: Math.round()可以四舍五入对数字取整 trace(Math.round(39.88)); //输出40 trace(Math.round(58.33)); //输出58 Math.floor()方法: Math.floor()可以向下取整 trace(Math.floor(39.88)); //输出39 trace(Math.floor(58.33)); //输出58 Math.ceil()方法: Math.ceil()可以向上取整 trace(Math.ceil(39.88)); //输出40 trace(Math.ceil(58.33)); //输出59 toFixed()方法: toFixed()方法四舍五入取指定位数的小数点,当其中参数为0时表示不留小数点 var temp:Number=3.1415926 //toFixed()中的参数就是需要取的小数位数,0表示不留小数点 var temp:Number=3.1415926 trace(temp.toFixed(2)); //输出3.14 trace(temp.toFixed(0)); //输出3 temp=18.888; trace(temp.toFixed(0)); //输出19 ============================== Math.round()方法取小数位数: 比如说3.14159要精确到.001位,则先3.14159/.001,然后再Math.round(3.14159/.001),最后在把结果乘以需要精确的位数Math.round(3.14159/.001)*.001 trace(Math.round(3.14159/.001)*.001); //输出3.142 trace(Math.round(3.14159/.01)*.01); //输出3.14 如果不想四舍五入,那直接改round()方法为floor()或者ceil()方法即可 toFixed()方法取小数位数: 直接指定toFixed()中的参数即可,比如要留两位小数,则toFixed(2) var temp:Number=3.1415926 trace(temp.toFixed(1)); //输出3.1 temp=18.888;//===========性能分析================
无论刚入门的还是有一定AS3编程基础的,对Math类应该都不陌生了,但Math类的性能又知多少呢?请看下文吧。
1、Math.floor()
通俗的讲这是一个取整函数。其实官方解释是
返回由参数 val 指定的数字或表达式的下限值。 下限值是小于等于指定数字或表达式的最接近的整数。 性能测试: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在取整,这样也是可以的,只不过用这个算法,存在跟第一个同样的问题,当目标数值为负时,两种方式结果不一样,需要加个判断,目标数值为负就把结果-1。
转载地址:http://vgjsi.baihongyu.com/