teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

スクリプトによる対処策を追加

2018/04/04 11:35

投稿

defghi1977
defghi1977

スコア4756

answer CHANGED
@@ -4,4 +4,38 @@
4
4
  とは言え, これが看過できないのであれば, 事前に`BigDecimal`の値を目的の形式の文字列(`BigDecimal.toPlainString`を使う?)としてから`form.setAaa`に渡せばよいでしょう.
5
5
 
6
6
  NOTE:
7
- なおその方法については別途お調べ下さい.(回答者はほとんどJavaを忘れています)
7
+ なおその方法については別途お調べ下さい.(回答者はほとんどJavaを忘れています)
8
+
9
+ ---
10
+ 追記
11
+
12
+ この後いろいろと調べてみた結果, Choromeでは小数点下の桁数が**6桁を超える(つまり7桁以上)**と`input[type="number"]`要素の表示内容が**強制的に浮動小数点形式になってしまう**ようです.
13
+
14
+ 従ってJSP側で`0.00000001`と出力しようが結局WEBブラウザ側で`1e-8`形式に変換してしまうため, クライアントサイドでのスクリプトで対処する他ありません.
15
+
16
+ そこで次のような回避スクリプトを作ってみました.
17
+ (とは言え、問題が完全に解決するわけではありません)
18
+
19
+ ```JavaScript
20
+ //※事前に読み込んでおく
21
+ //input[type="number"]要素の表記を修正する
22
+ function fixNum(input){
23
+ const value = input.valueAsNumber;
24
+ const numstr = value.toFixed(16);
25
+ if(numstr.match(/./) && value != 0){
26
+ input.value = numstr.replace(/0+$/, "");
27
+ console.log(value == input.valueAsNumber);//値に変化がないことを確認
28
+ }
29
+ }
30
+ ```
31
+ ```HTML
32
+ <!--問題を引き起こしているinput(form:input)要素の直後に下記のようなscript要素を記述しておく-->
33
+ <input type="number" value="1e-7" autocomplete="off" step="1e-7"/>
34
+ <script>
35
+ {
36
+ const input = document.currentScript.previousElementSibling;
37
+ input.addEventListener("change", e => fixNum(input));
38
+ fixNum(input);
39
+ }
40
+ </script>
41
+ ```

1

利用すべきと思われるメソッド名を追加

2018/04/04 11:34

投稿

defghi1977
defghi1977

スコア4756

answer CHANGED
@@ -1,7 +1,7 @@
1
1
  `form.setAaa`メソッドに渡した`BigDecimal`インスタンスの`toString`メソッドが暗黙的に呼び出されているのでしょう.
2
2
  `1e-8`は数値`0.00000001`の浮動小数点形式での記法で, 結局は同じ値を表していますから`input`要素に`type="number"`を指定していることから実用上の問題は発生しないと思われます.
3
3
 
4
- とは言え, これが看過できないのであれば, 事前に`BigDecimal`の値を目的の形式の文字列としてから`form.setAaa`に渡せばよいでしょう.
4
+ とは言え, これが看過できないのであれば, 事前に`BigDecimal`の値を目的の形式の文字列(`BigDecimal.toPlainString`を使う?)としてから`form.setAaa`に渡せばよいでしょう.
5
5
 
6
6
  NOTE:
7
7
  なおその方法については別途お調べ下さい.(回答者はほとんどJavaを忘れています)