zoukankan      html  css  js  c++  java
  • AS3数字取整

    AS3 数字取整方法
    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。

     

  • 相关阅读:
    MATLAB入门学习(一)
    4.21小练
    poj2312 Battle City 【暴力 或 优先队列+BFS 或 BFS】
    Mutual Training for Wannafly Union #2
    4.7-4.9补题+水题+高维前缀和
    CodeForces 91A Newspaper Headline
    codeforces 792C. Divide by Three
    3.26-3.31【cf补题+其他】
    poj3259 Wormholes【Bellman-Ford或 SPFA判断是否有负环 】
    二叉树基础练习
  • 原文地址:https://www.cnblogs.com/fengziwu/p/11175105.html
Copyright © 2011-2022 走看看