minetの日記: Firefox29までの input type="number" の小数桁数が少なすぎた話 3
HTML5では、input要素のtype属性にtype="number"と指定することで、入力内容を数値に限定したテキストボックスを表示できる。
UAによってはスピンボタン等が表示され、GUI操作で数値を増減させることも出来る。
デフォルトでは増減幅は1、つまり整数であり、この時、小数点以下を手入力してもエラーとなる。
最小の増減値はstep属性にて指定できる。step="0.1"と指定すれば、値は0.1単位で増減するようになり、小数の手入力も0.1単位で受け付ける。
ここでstep="0.0001"とすれば、当然、小数第4桁までの入力が可能となる。
…はずなのだが、Firefox29までは、入力した値が勝手に小数点以下3桁で丸められてしまう挙動だった。(現在は修正済)
小数第3桁とは、ずいぶんな粗さである。0.001ったら、年利も満足に表せない。緯度なら100メートル以上開く。秒なら1ミリ秒。とんでもなく粗い。
想像するに、Firefoxでの初期の実装はおそらく、入力値やstepの内部表現には素朴に2進浮動小数点数を使い、値の増減はstepの値を素朴に加算減算し、結果は素朴に10進文字列化して表示していたのだろう。
そうするとご存知の通り、誤差によって「0に0.1を10回足しても1じゃない!」という残念な結果になる。
そこで、急場凌ぎで「小数を固定桁で丸めて表示しよう」という発想になったのだろう。
まあ、ともあれ、丸め桁数の問題はバージョン30で修正された。
現在では安心してtype="number"を指定できる。
さて、step属性にはstep="any"という指定が可能で、その際は任意の桁長で小数の入力を受け付ける必要がある。もちろん、その際もスピンボタンによる値の増減は可能(単位は1)である。これを内部値が浮動小数点数のまま実装すれば、かなり残念なことになってしまう。
これはやはり、数値は10進で扱えという事か。
俺的には有効数字は3桁 (スコア:0)
小数第3桁とは、ずいぶんな粗さである。0.001ったら、年利も満足に表せない。
こんな細かい数字が必要になるなんて、年利のほうが異常なんですよ。10万円を一年預けていて1円の有無が気になるなんて。
いや現実、ブラウザで細かい数値を入力するのは勘弁して欲しいというのはあります。一方、日付や時間をいちいち十の位と一の位のとをそれぞれ別々に入力させるところも割と多くて、それも億劫ですけどね。
数値なら大体3〜4桁まで, 場所なら行政単位(県->市->区・町等)の階層を経てというのが妥当ではないでしょうか。コピペで貼れるというのは必要かもしれませんが、経度・緯度を分単位以下まで直接入力させるなんて通常のUIとしてはいかがなものかと。
Re:俺的には有効数字は3桁 (スコア:1)
> ブラウザで細かい数値を入力するのは勘弁
> 通常のUIとしてはいかがなものかと。
UI設計の点では同感なので、悩ましいです。
6桁も7桁も1つのフィールドに入力させたら、間違いの元にもなるし。
しかし細かく分けすぎてもかったるい…。
緯度・経度で言えば、むしろ緯度だけ・経度だけで個別に入力したくなる事が稀なので、
スペース・カンマ・セミコロン等で区切られた北緯と東経の2つの数値を「テキストで受け取る」UIでもいいかな、と思ったりします。
それなら一発でコピペできますし。
少数は少数でも (スコア:0)
確かfloatでしょ?
これdoubleのJSから扱う時不都合なんじゃないの?
Math.fround(0.1) !== 0.1 だし