末尾のゼロがどこから来ているかを説明するのは簡単です。
%g
簡単です:%g
デフォルトでは常に6桁の有効数字が表示されるため、
1.00000
0.100000
0.0100000
0.00100000
0.000100000
1.00000e-5
1.00000e-6
...
精度を有効桁数 1 桁に設定することでそれらを取り除くことができますが、たとえば、2.5 を 3 に丸めるので、おそらくそうしたくないでしょう。
aを直接実行すると、で定義されprintln
た結果 (a ) の表現が表示されます。double
Double.toString()
結果は、引数の符号と大きさ (絶対値) を表す文字列です。[...] マグニチュードm の場合:
[...]
mが 10 -3以上 10 7未満の場合、 mの整数部分として、先行ゼロなしの 10 進数形式で表され、その後に「.」が続きます。('\u002E') の後にmの小数部分を表す 1 つ以上の 10 進数が続きます。
[...]
mが 10 -3未満または 10 7以上の場合、いわゆる「コンピュータ化された科学的表記法」で表されます。nを 10 n ≤ m < 10 n +1となる一意の整数とします。次に、aをmと 10 nの数学的に正確な商とし、1 ≤ a < 10 とします。大きさは、 aの整数部分として、単一の 10 進数として表され、その後に「.」が続きます。('\u002E') の小数部分を表す10 進数が続きます。、その後に文字 'E' ('\u0045') が続き、メソッドによって生成される 10 進整数としてのnInteger.toString(int)
の表現が続きます。
[...]
mまたはaの小数部分は何桁表示する必要がありますか? 小数部分を表すには少なくとも 1 桁が必要であり、それを超える桁数は、引数の値を double 型の隣接する値と一意に区別するために必要な数だけです。
したがって、あなたが見る
1.0
0.01
0.0010
1.0E-4
9.999999999999999E-6
1.0E-6
...
では、末尾のゼロを取り除くにはどうすればよいでしょうか。
BigDecimal
1 つの方法は、メソッドを持つを使用するstripTrailingZeros()
ことです。ただし、次のように使用方法に注意する必要があります。
System.out.println(BigDecimal.TEN.pow( -4 ,MathContext.DECIMAL64).stripTrailingZeros());
期待されるものを出力します
0.0001
しかし
System.out.println(new BigDecimal(Math.pow(10,-4)).stripTrailingZeros());
印刷します
0.000100000000000000004792173602385929598312941379845142364501953125
それはたまたま10 -4double
に最も近い の正確な値だからです。
すべての計算を s で実行したくない場合はBigDecimal
、丸められた結果の文字列表現を取得し%g
(精度を制御する機会が得られます)、BigDecimal
それから を作成し、結果を出力できます。
System.out.println(new BigDecimal( String.format("%g", Math.pow(10,-4) ) ).stripTrailingZeros());