int関数は整数を丸めない [Edit]

「ActionScript辞書」(Flash MX/MX 2004)には、int()関数が値を整数に丸める(四捨五入する)かのように記載されています。ドキュメントバグでしょう。

Flash MX 2004の「ActionScript辞書」には、int()関数が「10進数を最も近い整数値に変換」するとあります。そして、Flash Player 5以降では、代わりにMath.round()メソッドの使用を推奨しています。この記載は、Flash MXの「ActionScript辞書」と基本的に同じです。

しかし、これは誤りです。実際にはint()関数は、10進数の整数部を返します。Flash 4の「ユーザガイド」(p.198)には、「特定の数値の整数値を返します」と説明され、「INT(12.5)は、12を返します」と正しく記述されています。

Flash 5の「ActionScript辞書」から、「説明」がFlash MX 2004とほぼ同じ誤った記載になったようです。しかし、代わりに使用すべきメソッドとしては、Math.floor()を正しく挙げています。これが、MXでご丁寧に誤記に合わせてMath.round()に変更されてしまったのでしょう。修正は、きちんと確認したうえで行ってほしいですね。

ちなみに、int(-12.1)は-12を返し、Math.floor(-12.1)が-13を返すのと異なった結果になります。したがって、int()関数の説明としては、小数を切捨てるのではなく、「値の整数部を取出す」と表現するのが正確です(ドキュメント正誤表参照)。

コメント

この記事へのコメント

  1. 1.野中文雄(2004年01月11日 00:43)

    マニアックな補足を、2点加えます。

    【「丸める」の意味】
    「丸める」という表現自体は、必ずしも四捨五入を意味する訳ではありません。国語辞書を引くと、正確な小数値(の一定桁数以降)を省いておおまかな整数(小数)にする、という程度の意味合いです。

    [大辞林第2版: 丸める]
    http://dictionary.goo.ne.jp/search.php?MT=%B4%DD%A4%E1%A4%EB&jn.x=25&jn.y=7&kind=ej&mode=0

    英語の原文は"round"です。これも、"round up"(切上げ)と"round down"(切捨て)などの表現があり、一概にはいえないかもしれません。しかし、"up"や"down"を明記しない場合には、四捨五入というニュアンスのようです。

    [英辞郎: round]
    http://www2.alc.co.jp/ejr/index.php?word_in=round&word_in2=%82%A0%82%A2%82%A4%82%A6%82%A8&word_in3=PPv2DKIlBGSINM2srX
    [Merriam-Webster Dictionary]
    http://www.m-w.com/
    roundの例文: 11.3572 rounded off to two decimal places becomes 11.36

    したがって、「丸める」という表現は、少なくとも意味が明確でない点で不適切です。また代わりに使用すべきメソッドとしてMath.round()を挙げていることを併せて考えれば、四捨五入を意味していると捉えられ、誤りだといえます。

    【負の数の切捨て】
    -12.1を「切捨てる」と-13なのでしょうか? 一般的には、-12という答えが返ってくるでしょう。実際Microsoft Excelのrounddown関数では、-12になります。

    数学あるいは算数における「切捨て」の定義は、残念ながら見つけることができませんでした[*1]。

    *1 興味深い議論が以下のURLにありました。
    [コロキウム室: マイナスの数]
    http://www.junko-k.com/collo/collo133.htm

    しかし、ActionScript(ECMA-262)上は、切捨てのメソッドはMath.floor()とされています。したがって、この仕様を「切捨て」と定義し、int()関数には別の表現を当てはめた方がよいでしょう。実際、プログラム上は、正負の区別をせずに統一的に数値を処理する[*2]Math.floor()メソッドの仕様の方が、0を中心にして対称に扱う[*3]int()関数より有利な点が多いでしょう。

    *2 Math.floor()メソッドは、指定された数値n以下のもっとも大きな整数Iを返します。

    *3 int()関数は、指定された値の整数部を返します。いいかえれば、指定された数値nの絶対値|n|を切捨て、符号をつけ直した整数値にするということです。

  2. 2.捨吉(2006年03月07日 18:10)

    いろいろ気になったので書き込んでみます。

    小数点以下の切り捨てって
    たしか『その値よりも小さい整数にする』はずなので、
    負数の小数点以下の切り捨ては
    -13 < -12.1 だから
    -12.1は-13で正しいはず。数直線的に。

    小数点数の整数への丸めは
    『近い整数にする』ことだから、
    -12.5とかの0.5(中間の値)は
    -12と-13のどっちが近いかわからない。
    round~関数の仕様は不明ですが、
    0に近い整数に丸めるのがrounddownで
    roundupは0から離れた方の整数に丸めるんじゃないでしょうか?
    ほぼ推測で書きましたので、あしからず。

    では。

  3. 3.野中 文雄(2006年03月10日 15:06)

    > 小数点以下の切り捨てって
    > たしか『その値よりも小さい整数にする』はずなので、
    その定義の出典または論拠を、お教えいただけますか? 私がざっと調べたところでは、コメントに述べたとおり「数学あるいは算数における『切捨て』の定義は、残念ながら見つけることができませんでした」。

    改めてWikipediaを確認したところ、つぎのように説明されていました。この記述からは、むしろ0に近い整数に丸めるように読めます(おそらく負の値が考慮されていないものと推測されます)。

    http://ja.wikipedia.org/wiki/%E5%88%87%E3%82%8A%E6%8D%A8%E3%81%A6#.E5.88.87.E3.82.8A.E4.B8.8A.E3.81.92.E3.83.BB.E5.88.87.E3.82.8A.E6.8D.A8.E3.81.A6
    「有効数字を n 桁とするときに、n + 1 桁目が何であってもそれ以下の端数が無いものとして概数を得る端数処理を切り捨てという。」

    > -12.1は-13で正しいはず。数直線的に。
    上述の定義にしたがえば、そのとおりです。これはMath.floor()メソッドの仕様です。

    > 0に近い整数に丸めるのがrounddownで
    Excelのrounddown()関数の仕様は、そのとおりです。しかし、"round down"は、「切り捨てる」と訳されます。
    http://dictionary.goo.ne.jp/search.php?MT=round&search_history=round+down&kind=ej&kwassist=0&mode=0

    「小数点以下の切り捨て」は前述の「定義」のとおりで、「-12.1は-13で正しいはず」であれば、rounddown()関数の仕様は「間違っている」ということになるのでしょうか?

    本稿の本文および私のコメントは、Math.floor()とrounddown()関数(int()関数も同じ)のふたつの処理の仕方があって、注意する必要があるということを述べました。また、どちらが正しいとか間違っていると結論づけることはできないという見方です。

    ただ、プログラミングでも数学でも、「正負の区別をせずに統一的に数値を処理するMath.floor()メソッドの仕様の方が」有利だとは思います。

その他の記事