Math類的誤區

2021-04-30 23:35:54 字數 3063 閱讀 6162

無論剛入門的還是有一定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 ++)

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 ++)

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 ++)else

}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 ++)

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 ++)

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 ++)

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 ++)

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 ++)

trace(gettimer() - time);

// 結果:68

複製**

四捨五入其實加個0.5在取整,這樣也是可以的,只不過用這個演算法,存在跟第乙個同樣的問題,當目標數值為負時,兩種方式結果不一樣,需要加個判斷,目標數值為負就把結果-1。

Java常用類 Math類

math類是乙個工具類,它的構造器 被定義成private,因此無法建立它的物件,math中所有的方法都是靜態的 可以直接通過math類名進行呼叫。math類還有兩個類變數 pi 和 e 它們分別對應 和 e math類中目前自己常用的幾個方法 math.floor double a 返回小於目標數...

常用類之Math類

math類中常用方法 1 三角函式方法 math類包含下面的三角函式方法 math.todegrees 這個方法是將 2到 2之間的弧度值轉化為度,例如 math.todegrees math.pi 2 結果為90.0 math.toradians 這個方法是將度轉化為 2到 2之間的弧度值,例如 ...

常用類 二 Math類

常用類 一 arrays陣列工具類 常用類 二 math類 常用類 三 bigdecimal和biginteger大數類 常用類 四 random隨機數類 常用類 五 date日期類和calender日曆類 常用類 六 string類與字串 常用類 七 包裝類 最小值 返回a,b中小的數 最大值 返...