Hatena::ブログ(Diary)

独学ActionScript このページをアンテナに追加 RSSフィード

2008.10.03

【AS3入門】Flex 3でNumber型メンバ変数を割り算して初期化したら整数値になる現象

(2009.03.15 12:45 追記) Flex 3 SDK ver.3.3.0.4589で試したところ、正常に動作するようになっていました。

Flash CS3とFlex 3 SDKで出力結果が違う、というとても興味深い内容だったので備忘録。原因不明。こちらのブログで知りました。素敵情報に感謝。

タロタローグ ブログ | AS3のメンバ変数(Number型)を割り算で初期化したら整数値になってた件

以下その現象が起こるソースコード

package
{
    import flash.display.Sprite;

    public class Sample extends Sprite
    {
        public var num:Number = 1 / 30;
        public function Sample()
        {
            var num2:Number = 1 / 30;
            trace(num);
            trace(num2);
            trace(1 / 30);
        }
    }
}

Flash CS3での出力結果

0.03333333333333333
0.03333333333333333
0.03333333333333333

Flex 3 SDK(ver. 3.1.0.2710)での出力結果

0
0.03333333333333333
0.03333333333333333

Flex 3 SDK (ver. 3.3.0.4589)での出力結果 (2009.03.15 12:45 追記)

0.03333333333333333
0.03333333333333333
0.03333333333333333

これはなぜでしょう?とても気になります。if (num is Number)と聞いてみるとちゃんとtrueを返すので勝手に型変換とかされているわけではないみたいです。publicとprivateやvarとconstを変えたりしてみても結果は変わらず。


ところが、初期化方法を割り算ではなく、数値をそのまま入れたり、

public var num:Number = 0.03333333333333333;

足し算してみたり、

public var num:Number = 0 + 0.03333333333333333;

掛け算してみたり、

public var num:Number = 1 * 0.03333333333333333;

した場合は、Flash CS3・Flex 3 SDKともに同じ結果(0.03333333333333333)を返します。前述のブログ記事で指摘されているとおり、Flex 3 SDKでは割り算した場合のみ整数しちゃうようです。

また、「結果がゼロ以下の数値だから〜」かと思って試してみましたが、結果がゼロ以上の数値でも整数化される模様。

public var num:Number = 10 / 3;

Flash CS3での出力結果

3.3333333333333335

Flex 3 SDK(ver. 3.1.0.2710)での出力結果

3

謎ですね。ユーザー側が望む結果としてはFlash CS3の方が適切だと思いますが、バージョンはFlex 3 SDKの方が新しいので、もしかしたら仕様変更などがあったのかもしれません。もしくはただのバグかもしれません。この件について詳しい情報を見つけたりしたら追記したいと思います。


まとめ

このシリーズのエントリーは、「AS3入門」のまとめにまとめてあります。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証