Number#toFixedの解釈2007年05月22日 17時55分04秒

またEnjoy*Studyさんの後追いかよ...

Date#formatのミリ秒フォーマットの実装部分で疑問を持ったのだが、Number#toFixedの丸め方が実装依存みたいだ。ちょっと気になって検索したら、dateformat.jsの作者さんがやはり「Number#toFixedがブラウザによって結果が異なる場合がある」なんてエントリをあげておられた。つくづく後追いしてるな > 俺

まあ、がんばって調べてみるか。

Under Translation of ECMA-262 3rd Editionを一生懸命読んでみる

一旦読んで「さっぱりだぜ」とあきらめていたがもう一度Nuber.prototype.toFixedのところを読み直し、Enjoy*Studyさんが例示しておられたパターンでどうなるかを確認してみた。

  • ステップ1から。対象の数値が「1.255」、toFixedのパラメータが「2」なので、f = 2x = 1.255となる。0 <= f <= 20 且つ ! isNaN( x ) 且つ 0 <= x <= Math.pow( 10, 21 ) を満たすのでステップ10へ
  • n / Math.pow( 10, f ) - x が限りなく0に近くなることを満たす整数nを考える。 → n / Math.pow( 10, 2 ) - 1.255 → n / 100 - 1.255 なので、n125126 あたりか。
  • 「そのようなnが2個あれば、大きいほうをnとする」とあるので一旦 126 か?とも思ったが、「厳密な数学値が限りなく0に近い」とあるので、1.26 - 1.255と1.25 - 1.255の絶対値を見てみることに。
  • Math.abs( 1.26 - 1.255 ) // → 5.00000000000012E-03(JScript)、0.0050000000000001155(Firefox)
  • Math.abs( 1.25 - 1.255 ) // → 4.99999999999989E-03(JScript)、0.004999999999999893(Firefox)
  • ということで、n125となり、n != 0 なのでm = 125で確定。(たぶん)
  • 後はステップ13 → 14 → 18 とすなおに解釈すると、(1.255).toFixed(2) = 1.25 となる。
なんだ、やっぱIEじゃん。

結論

IEのNumber#toFixedは仕様と違う

...とはいっても、dara-jの解釈が間違ってるかもしんないし...

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://dara-j.asablo.jp/blog/2007/05/22/1526003/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。