- ベストアンサー
FlashLite の Math.floor() がおかしい
Flash8 で Flash Lite1.1形式のデータを作成しています。 Math.floor()を使った処理を行いたいのですが 下記のように小数点が存在しない値でも謎の切り捨てが 発生してしまいます。 a = 2; b = 10; trace( Math.floor(a / b * 10) ); ← 1 trace( Math.floor(2 / 10 * 10) ); ← 2 期待通り これってなにか回避策はないのでしょうか。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
おもしろい! と喜んでいてはダメなのですよね。 私はそれで困っていないので単にすごく面白いです(失礼)。 「i モード用 Flash 開発講座」 http://www.macromedia.com/jp/devnet/devices/articles/togoru_03.html コアオブジェクト・・・Flash 4 ベースのため、Array、Math、MovieClip、Date などのオブジェクトがありません。 例外として、Math.cos() などの定数が存在します というわけで, Math.floor がダメなのかもしれないと思い, int でしてみました。 でも結果は同じ。 それも,普通の Flash Player で見たときは正常で, ムービープレビューで携帯デバイスを選択するか, i モード HTML シミュレータ で見ると確かに変になります。 いろいろしてみましたが,こんな感じです。 a = 1; b = 10; trace(a/b); //→ 0.1 trace(a/b*10); //→ 1 trace(int(a/b*10)); //→ 1 trace(int(1/10*10)); //→ 1 a = 2; b = 10; trace(a/b); //→ 0.2 trace(a/b*10); //→ 2 trace(int(a/b*10)); //→ 1 変! trace(int(2/10*10)); //→ 2 a = 3; b = 10; trace(a/b); //→ 0.3 trace(a/b*10); //→ 3 trace(int(a/b*10)); //→ 3 trace(int(3/10*10)); //→ 3 a = 4; b = 10; trace(a/b); //→ 0.4 trace(a/b*10); //→ 4 trace(int(a/b*10)); //→ 3 変! trace(int(4/10*10)); //→ 4 a = 2; b = 10; c = a/b; //→ 0.2 d = a/b*10; //→ 2 e = int(a/b*10); //→ 1 変! f = int(2/10*10); //→ 2 ちなみに, a = 6; b = 10; や a = 8; b = 10; のときは,予想に反して正常でした。 うーん,変だ! けどおもしろいです。 私は自サイトではあまり,JavaScript を使いませんし, あまり得意ではないので,回答も極たまにしかしませんが, Flash の向学のために JavaScript カテゴリも結構見ているのです。 よく似たような質問があったのを記憶していたので,一応書いておきます。 「質問:乗算した時に数値が変わってしまいます」 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1757925 ↑教えて!goo ↓OKWave (同じです) http://okwave.jp/kotaeru.php3?q=1757925 単なる確信もない推測ですが, これと同様,Flash Lite 特有の,それもたまにしか出ない誤差ではないでしょうか。 Flashドキュメンテーション Flash Lite 1.x ActionScript リファレンスガイド > Flash Lite の演算子 > / (除算) http://livedocs.macromedia.com/flash/8_jp/main/00005278.html expression1 を expression2 で除算します。除算演算の結果は倍精度の浮動小数点数です。 Flashドキュメンテーション ActionScript 2.0 リファレンスガイド > ActionScript 言語エレメント > 演算子 > / 除算演算子 http://livedocs.macromedia.com/flash/8_jp/main/00001819.html expression1 を expression2 で除算します。除算演算の結果は倍精度の浮動小数です。 浮動小数点数 と 浮動小数 は同じ物かどうかよくわからない素人ですが, 浮動小数点数型と誤差 http://www.kyoto-su.ac.jp/~yamada/programming/float.html ↑こんなようなものではないでしょうか??? ~~~ 対処方 ~~~ //先に 10 を掛けておく a = 2; b = 10; aa = a*10; trace(aa/b); //→ 2 trace(int(aa/b)); //→ 2 trace(int(20/10));//→ 2 ~~~ ~~~ ~~~ ぜんぜん対処法になっていない気がしますね…。 以上,素人ながらの勝手な推測と, 全然対処にならない対処法でした。 実はおもしろい現象を発見されたのに感動したことが言いたかっただけのような気もします三(m;_ _)mペコ。
お礼
返事が遅くなりましてすいません。 いろいろ調べていただいてありがとうございます。 なんとなくFlashLiteのバグではないかと思うので、 macromediaに報告のうえアップデートを待ちたいと思います。