2

誰かがJavaフロートで私を助けてくれませんか。たとえば、Javaとの不一致を観察しました

Math.pow(10.0,-2)==0.01
Math.pow(10.0,-3)=0.0010 (instead of 0.001)
Math.pow(10.0,-4)=1.0 E-4
printf("%g",Math.pow(10,-4)) =0.000100000 

一方、Python の場合:

10**-1=0.1
10**-2=0.01
10**-3=0.001

Clojure 1.4 で

(Math/pow 10 -2) = 0.01
(Math/pow 10 -3) = 0.001

私の質問は、Python と比較した場合に Java で同様の結果を得るにはどうすればよいかということです。これらの末尾のゼロが追加されるのはなぜですか、それらを抑制する方法はありますか?

4

2 に答える 2

5

末尾のゼロがどこから来ているかを説明するのは簡単です。

%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 ) の表現が表示されます。doubleDouble.toString()

結果は、引数の符号と大きさ (絶対値) を表す文字列です。[...] マグニチュードm の場合:

[...]

mが 10 -3以上 10 7未満の場合、 mの整数部分として、先行ゼロなしの 10 進数形式で表され、その後に「.」が続きます。('\u002E') の後にmの小数部分を表す 1 つ以上の 10 進数が続きます。

[...]

mが 10 -3未満または 10 7以上の場合、いわゆる「コンピュータ化された科学的表記法」で表されます。nを 10 nm < 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
...

では、末尾のゼロを取り除くにはどうすればよいでしょうか。

BigDecimal1 つの方法は、メソッドを持つを使用する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());
于 2012-05-18T20:09:40.783 に答える
0

問題が表示だけの場合は、DecimalFormat と '#' http://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.htmlを使用できます。

于 2012-05-18T19:44:23.113 に答える