In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

Round up decimal numbers by using toFixed () を使って小数点以下を四捨五入

消費税などの計算をas3で無難にやり過ごす方法 (たぶん大丈夫)
as3では、小数が絡んだ掛け算・割り算の処理が面倒。
消費税の計算なんかで、慣れていないと頭をかかえることに。
例えば、7 x 1.197 の計算は、手持ちのキャノンの計算機では 素直に
8.379 とはじき出してくれるのに、何故か as3 では 8.379000000000001 
みたいになる事がある。
これは、自分には難しくて分からないけど as3 の 「仕様」 らしい。
参照:"Flash returns erroneous results for certain mathematical calculations"
http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_13989
更には、その計算結果を四捨五入しなさいとくれば、余計面倒くさい。
最近では toFixed を使って、小数第3位を四捨五入しています。(合っているかな?)
以下は、その方法を簡単に纏めてみたものです。
注) toFixed の結果は、Sting型の文字列になります。
Get Adobe Flash player
by hacker_fjam9dgc 12 Mar 2010
/**
 * Copyright hacker_fjam9dgc ( http://wonderfl.net/user/hacker_fjam9dgc )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/stDP
 */

// 消費税などの計算をas3で無難にやり過ごす方法 (たぶん大丈夫)
// 
// as3では、小数が絡んだ掛け算・割り算の処理が面倒。
// 消費税の計算なんかで、慣れていないと頭をかかえることに。
// 
// 例えば、7 x 1.197 の計算は、手持ちのキャノンの計算機では 素直に
// 8.379 とはじき出してくれるのに、何故か as3 では 8.379000000000001 
// みたいになる事がある。
// これは、自分には難しくて分からないけど as3 の 「仕様」 らしい。
// 参照:"Flash returns erroneous results for certain mathematical calculations"
// http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_13989
// 
// 更には、その計算結果を四捨五入しなさいとくれば、余計面倒くさい。
// 
// 最近では toFixed を使って、小数第3位を四捨五入しています。(合っているかな?)
// 以下は、その方法を簡単に纏めてみたものです。
// 注) toFixed の結果は、Sting型の文字列になります。

package {
    // diaplay系
    import flash.display.Sprite;

    // text系
    import flash.text.TextField;
    import flash.text.TextFieldType;
    
    public class FlashTest extends Sprite {
    	
		public function FlashTest() {
            // テキストフィールド準備
            makeMessageField ("fld_message_1", "inputテキストフィールドですので、出力結果欄を自由にスクロール出来ます。詳しくはコメント欄を御覧下さい。" , 0 , 0 , 40) ;
            makeMessageField ("fld_message_2", "四捨五入無し" , 0 , 40, 40) ;
            makeMessageField ("fld_message_3", "" , 0 , 80 , 120 ) ;
            // makeMessageField ("fld_message_4", "補正あり(  使用)" , 0 , 120) ;
            // makeMessageField ("fld_message_5", "" , 0 , 160 );
            makeMessageField ("fld_message_6", "少数第3位で四捨五入( toFixed 使用 )" , 0 , 200 , 40) ;
            makeMessageField ("fld_message_7", "" , 0 , 240 , 120 );
            
            // 本題の計算ループ
            // 
            var target_mc_sans : Object  = getChildByName ( "fld_message_3" ) ;
            var target_mc_avec : Object  = getChildByName ( "fld_message_7" ) ;
            var vatInclus : Number ;
            for (var euro : int = 0 ; euro <= 200 ; euro ++ ) {
            		vatInclus = 1.197 * euro ;
            		target_mc_sans.text += euro + " : " + String ( vatInclus ) + "\n";
            		target_mc_avec.text += euro + " : " + vatInclus.toFixed ( 2 ) + "\n";	
            }
        }
        
        private function makeMessageField (namae : String, defaultMessage : String , zahyoX : Number, zahyoY : Number , takasa : Number) : void {
        		var tf_messageField : TextField = new TextField ();
        		tf_messageField.name = namae;
        		tf_messageField.type = "input";
        		tf_messageField.width = 400;
        		tf_messageField.height = takasa;
        		tf_messageField.x = zahyoX;
        		tf_messageField.y = zahyoY;
        		tf_messageField.border = true;
        		tf_messageField.wordWrap = true;
        		tf_messageField.text = defaultMessage;
        		addChild( tf_messageField );
        }
    }
}