今回の話題は、ActionScriptでクラスを定義していたときに出会った不思議な現象。四則演算の結果が、クラスのどこに書かれるかによって結果がかわってくるというもの。今回説明のために用いる計算式は、5÷10×3である。計算結果は、1.5となるはずである。
ところが、ActionScriptでは、この式がどこに書かれるかによって、結果がかわってくるのである。次がそれを見るためのサンプルコードである。
package {
import flash.display.Sprite;
public class Arithmetic extends Sprite {
private var a:Number = 5 / 10 * 3;
private var b:Number = 5 * 3 / 10;
private var c:Number = 5.0 * 3.0 / 10.0;
public function Arithmetic() {
var d:Number = 5 / 10 * 3;
var e:Number = 5 * 3 / 10;
trace("a =", a);
trace("b =", b);
trace("c =", c);
trace("d =", d);
trace("e =", e);
trace(”5/10*3 =", 5 / 10 * 3);
trace("5*3/10 =", 5 * 3 / 10);
}
}
}
このコード内には
a
から
e
までの変数が定義されており、それぞれに先述の計算式の結果が代入されるようになっている。したがって、すべての変数の値は同じ
1.5
になると予想される。最後の2行のtraceは変数を媒介しない場合の結果を念のため出力している。もちろん、この結果も
1.5
となるだろう。では、結果である。
a = 0
b = 1
c = 1.5
d = 1.5
e = 1.5
5/10*3 = 1.5
5*3/10 = 1.5
なんと、変数
a
と
b
は、予想外の結果である。どうも整数として計算されているようだ。あえて小数点以下を記述してみると、
c
にあるように
1.5
になる。しかし、コンストラクタ内の式では、小数点などつけなくてもちゃんと実数として計算されている。とんだ落とし穴である。メンバー変数の定義に初期値を計算式で記述する場合には、注意が必要なようだ。どうしてこうなるのか理由は不明だ。
ちなみに、
a=0
となる理由は、最初の割り算の結果が
0
になっているからで、その後は何をかけ算しようと結果は
0
である。一方、
b=1
となる理由は、先にかけ算が実行される事で値が
0
になる事を防いでいるからである。