• ベストアンサー

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 期待通り これってなにか回避策はないのでしょうか。

  • dany
  • お礼率69% (29/42)
  • Flash
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
noname#35109
noname#35109
回答No.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ペコ。

dany
質問者

お礼

返事が遅くなりましてすいません。 いろいろ調べていただいてありがとうございます。 なんとなくFlashLiteのバグではないかと思うので、 macromediaに報告のうえアップデートを待ちたいと思います。

関連するQ&A

  • .NET 小数点以下の切り捨てについて

    小数点以下を切り捨てにしたいのですが 割り切れる場合だけ数値が思うようになりません 3850/1.1は3500になるはずですが以下のコードではre=3499になります double a = 3850; double b = 1.1; String^ re = Math::Floor(a/b).ToString(); 結果を3500にするにはどのような切り捨て処理をすれば良いのでしょうか?

  • excel FLOOR関数について

    excelのFLOOR関数について教えてください。 =FLOOR(A1,"00:15:00")/"1:00" とは、どういうことをしているのでしょうか。 時間に関することを扱っているセルの関数です。 マニュアルには値の切り捨て等が記載されていますが、"00:15:00"の意味がわかりません。これは文字列なのではないでしょうか。 FLOOR関数は文字列に対しての操作もするということですか。 不勉強ですみませんが、教えてください。お願いします。

  • 配列を使って、ランダムな値を複数作りたい

    いつも、ありがとうございます。MAC_OSXでFlash8です。 配列を使い4つの値をランダムに出し、spd1~spd4までの変数に入れたいのですが、つまづいて立ち往生しています。今は、下記のようになっています。 randomList = new Array (1, 2, 3, 4); for (i = 1; i <= 4; i++) { pos = Math.floor (Math.random () * randomList.length); spdNum = randomList[pos]; spd = spdNum; spdban = "spd"+i; spdban = spd; randomList.splice (pos, 1); } trace (spd1); trace (spd2); trace (spd3); trace (spd4); で、traceしても値は出てきません。 spdbanにその都度、値が入ってしまうということだと思うのですが、spd1~spd4までにそれぞれ値を入れるにはどうしたらいいのでしょうか? よろしく、お願いします。

    • ベストアンサー
    • Flash
  • Flash 8 BasicからFlash Lite1.1にパブリッシュ

    カテゴリーがわからなかったので、 こちらのカテゴリーにも投稿させていただきます。 Flash 8 Basicを使って、携帯用の動画を制作しています。 今回はどうしてもパブリッシュ形式をFlash Lite1.1にしないといけません。 Flash 8 BasicからFlash Lite1.1にするには、 パブリッシュ設定をFlash Player4にするというふうに聞いたので、 試してみたのですが、エラーになってしまい、できません。 ちなみにこの動画は簡単な物でActionScriptは使っていません。 なんとかFlash lite 1.1の形式で書き出せないでしょうか?

    • ベストアンサー
    • Flash
  • 【数字ランダム】計算問題ランダム計画

    1から10の乱数を使った 足し算、引き算を考えていまして、 ダイナミックテキスト(mondai)に 式と答えを表示。 同じ数字の組み合わせの問題が続けて出るので それを回避するために、 皆様のお知恵をお借りしたいと思いました。 自分が考えている回路図は、 //乱数[0-9] randam_a = Math.floor(Math.random()*10); randam_b = Math.floor(Math.random()*10); //足し算か引き算か計算ちぇっく check = Math.floor(Math.random()*2); ※このあたりに前回のrandam_a & randam_bの 値を調べて同じならば、前回と違う値が入るまで loop処理を加える。 //足し算ならば if (check == 0){   total = randam_a - randam_b ;   mondai = String(randam_a)+"+"+String(randam_b)+"="+String(total); //引き算ならば } else if (check == 1) {    total = randam_a + randam_b ;    mondai = String(randam_a)+"-"+String(randam_b)+"="+String(total); //引き算の処理ならば }else if (check == 1){ (略してます) } という流れを考えてます。 それ以外に、いけそうな処理の流れが あれば、そのチャートも知りたいので 解説して頂けると勉強になります>< 宜しくお願いします!

    • ベストアンサー
    • Flash
  • エクセル 関数を教えてください。

    エクセル 関数を教えてください。 数点第一位の値が5のときだけ小数点第二位の値で切り上げか切り捨てかを判断します。 小数点第二位が0のときは切り捨て、1以上のときは切り上げ計算になります。 (例)4.50点→4点 、 4.51点→5点 小数点第一位が5以外の場合は四捨五入と同じ要領です。 ●A1に数字入力、B1に計算式をお願いします。

  • エクセル 切捨てや、四捨五入で出た値の集計式

    切捨てや、四捨五入で出た値を集計すると、多少の誤差が出る場合があります。どの様な数式にすればいいでしょうか。例題を下記にしるしましたので具体的に教えて下さい。     A          B         C 1   293,500      17,610 2   349,750      2,099       15,512 A1とA2は既定値。B1は、TRUNC(A*0.006,0)で小数点以下切捨て。 B2は、SUM(A2*0.006)で小数点以下四捨五入。 C2は、SUM(B1-B2)。 C2の正解は15,511ですが、1多い答えがでます。

  • 【FLASH】小数点以下の「0」も表示したい。(1 → 1.0 など)

    FLASH8(Win-XP)使用者です。 残り時間の秒数などを小数点以下第1位まで表示させたい場合、通常のやり方、 hyoji.text = Math.floor(jikan*10)/10; などですと、小数点以下が0の場合は0が表示されません。どうすれば1.0などと表示されるのでしょうか。 お詳しい方、よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • 最適な端数処理方法と処理位置を知りたい

    1から99,999,999,999までの整数Aと0.01から999,999.99までの小数Bがあり、A÷Bの商Cに再度Bを掛けて得られる積をAと同じ値にしたいです。A÷BとC×Bの算出時に四捨五入等・切り捨て・切り上げのいずれかの処理を行わなければならない場合、両式の小数点第何位でどの処理をすれば結果がAになるでしょうか。 よろしくお願いいたします。

  • 数式によって導き出した数値の切捨

    エクセルでセルに数式を入れて導き出した値を自動的に小数点以下切捨てにする方法がわかりません。 (例・セルの計算式) =A2(他のセル。ここでは3200とします)/1.2(値は2666.6666になります) セルに返される値は小数点以下を切上げて「2667」。 これを切捨して2666にしたい。 どなたか方法を教えてください。 たいへんわかりづらい説明だと思いますが宜しくお願いいたします。