博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AS3数字取整
阅读量:4106 次
发布时间:2019-05-25

本文共 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/

你可能感兴趣的文章
Java--String/StringBuffer/StringBuilder区别
查看>>
分布式之redis复习精讲
查看>>
(python版)《剑指Offer》JZ01:二维数组中的查找
查看>>
(python版)《剑指Offer》JZ06:旋转数组的最小数字
查看>>
(python版)《剑指Offer》JZ13:调整数组顺序使奇数位于偶数前面
查看>>
(python版)《剑指Offer》JZ28:数组中出现次数超过一半的数字
查看>>
(python版)《剑指Offer》JZ30:连续子数组的最大和
查看>>
(python版)《剑指Offer》JZ02:替换空格
查看>>
JSP/Servlet——MVC设计模式
查看>>
使用JSTL
查看>>
Java 8新特性:Stream API
查看>>
管理用户状态——Cookie与Session
查看>>
最受欢迎的前端框架Bootstrap 入门
查看>>
JavaScript编程简介:DOM、AJAX与Chrome调试器
查看>>
通过Maven管理项目依赖
查看>>
通过Spring Boot三分钟创建Spring Web项目
查看>>
Spring的IoC(依赖注入)原理
查看>>
Java编程基础:static的用法
查看>>
Java编程基础:抽象类和接口
查看>>
Java编程基础:异常处理
查看>>