書式設定の使用を避けたい場合は、結果を印刷する前に固定精度に丸め、Java が表現エラーを隠すために少量の丸めを行うという事実を利用することができます。
例 小数点以下 6 桁まで
public static double round6(double d) {
return Math.round(d * 1e6) / 1e6;
}
round()
との結果は1e6
正確に表すことができます。さらに、「IEEE 754では正しい丸めが必要です。つまり、丸められた結果は、値を計算するために無限に正確な算術演算が使用されてから丸められたかのようになります」残っている唯一のエラーは、最も近い表現可能な値を取るための表現エラーです。Java の toString() は、より短い 10 進数の最も近い表現可能な値を持つ double がある場合、それが見たいものであると想定しています。
例 0.1 の実際の値は
System.out.println(new BigDecimal(0.1));
版画
0.1000000000000000055511151231257827021181583404541015625
ただし、Double.toString() にこの値が渡されると、0.1 がこの double に変換されると判断されるため、これが表示されます。
ところでJava 6には、最小桁数を使用しないというバグがあります。
for (int i = 1; i <= 9; i++)
System.out.print(i / 1000.0 + " ");
Java 6プリントで
0.0010 0.0020 0.0030 0.0040 0.0050 0.0060 0.0070 0.0080 0.0090
そしてJava 7プリントで
0.001 0.002 0.003 0.004 0.005 0.006 0.007 0.008 0.009
パフォーマンスが重要でない場合はよく printf を使用します。重要な場合は、カスタム ルーチンを使用して double を直接 ByteBuffer に固定精度で書き込みます (効果的に丸めます)。これは、オブジェクトを作成しないため高速です。
また、結果が 1.1234567891234567 または 1.33333333333333 のような場合にデータが失われるのを避けたいと思います。これらの場合、結果は同じままでなければなりません。
その場合、結果を表示する必要があるまで結果を丸めないでください。