2

このdouble変数doubletest=58.15に対して以下のjavaprintコマンドを実行します。System.out.println(test);を実行すると およびSystem.out.println(new Double(test).toString()); 58.15として印刷されます。

System.out.println(new BigDecimal(test))を実行すると、以下の値が得られます58.14999999999999857891452847979962825775146484375

「テスト」の二重変数値が58.1499999として内部に格納されていることを理解できます。しかし、以下の2つのSystem.out.printlnを実行すると、58.1499999ではなく58.15として出力が取得されます。

System.out.println(test);

System.out.println(new Double(test).toString());

上記の2つについては、出力を58.15として出力します。

上記のSystem.out.printlnステートメントは、値58.1499999を丸めて、58.15として出力していますか?

4

3 に答える 3

5
System.out.println(new BigDecimal("58.15"));

ハードコードされた定数からBigDecimalを構築するには、常にクラス内の定数の1つ(ZEROONE、またはTEN)または文字列コンストラクターの1つを使用する必要があります。その理由は、値を2倍にすると、二度と取り戻せない精度がすでに失われているためです。

編集:polygenelubricantsは正しいです。具体的には、Double.toStringまたは同等のものを使用しています。そこから引用するには:

mまたはaの小数部分に何桁印刷する必要がありますか?小数部分を表すには少なくとも1桁必要であり、それを超えると、引数値をdouble型の隣接する値と一意に区別するために必要な桁数だけになります。つまり、xが、有限の非ゼロ引数dに対してこのメ​​ソッドによって生成された10進表現によって表される正確な数学値であると仮定します。その場合、dはxに最も近いdouble値でなければなりません。または、2つのdouble値がxに等しく近い場合、dはそれらの1つであり、dの仮数の最下位ビットは0である必要があります。

于 2010-03-09T02:18:41.883 に答える
3

はい、println(より正確にはDouble.toString)ラウンドします。証明のために、バイナリで表すことは不可能なをSystem.out.println(.1D);印刷します。0.1

また、を使用する場合は、コンストラクターをBigDecimal使用しないでください。doubleコンストラクターは、不正確な値を正確に表現しようとするためです。String代わりにコンストラクターを使用してください。

于 2010-03-09T02:19:59.770 に答える
1

out.printlnDouble.toString(double)Double.toString()で指定された形式を使用します。

BigDecimalは、 javadocで説明されているように、デフォルトでより高い精度を使用しますtoString()。.15には正確なバイナリ表現がないため、 BigDecimalを呼び出すと、プリミティブdoubleで使用可能な精度レベルまでのすべての文字が出力されます。

于 2010-03-09T02:20:51.017 に答える