2017-01-04 7 views
0

:私が得たJavaで大きな10進値を丸める方法は?私が最初に設定され、小数点フォーマットに基づいて進数を丸めるために、次のコードにしようとしている

DecimalFormat df = new DecimalFormat("#.000"); 
df.setRoundingMode(RoundingMode.FLOOR); 

double a = Double.parseDouble(df.format(43.473684210526315)); 
double b = Math.pow(a, 10); 
double c = Double.parseDouble(df.format(b)); 

System.out.println(a + " ** " + b + " ** " + c); 

結果は次のとおりです。あなたのよう

43.473 ** 2.4109939006965688E16 ** 2.4109939006965688E16 

参照:aの値は正しくフォーマットされています。他の値はそうではありません。何が起こっているのかを理解しようとしている間、長い時間を費やした後、値2.4109939006965688E16をフォーマットできないことがわかりました。私はE16を取り除いて同じ値をテストしたところ、うまくいきました。

私の質問は、それがaとして機能するように、このような大きな小数点をどのように丸めることができますか?あなたの「ビッグ」小数の場合

+4

次の出力に結果でありますあなたはE16が何を意味するのか気づいている – Florian

答えて

1

aが動作するのは純粋な運です。初期値が43.4701の場合、43.47が表示されます。場合によっては、精度がdoubleであるため小数点以下3桁が表示されることがあります。

Stringは、DecimalFormatterを使用してすぐにdoubleに戻ります。あなたはその文字列を保持し、使用したいと思う。

DecimalFormat df = new DecimalFormat("#.000"); 

double b = Math.pow(43.473684210526315, 10); 

String bFormatted = df.format(b); 

System.out.println(bFormatted); 

は、あなたの希望する出力多数の場合24115485538109308.000

1

あなたは次の形式を使用することができます:私はここにいくつかの問題を参照してください

DecimalFormat df2 = new DecimalFormat("#.000E0"); 
1

を:

  • あなたのDecimalFormatのロケールを指定しないでください。そのため、DecimalFormat.formatDouble.parseDoubleの組み合わせは、エラーが発生しやすくなります。ドイツ語のロケールでは、DecimalFormat.formatは小数点区切り記号としてカンマを使用しますが、これはDouble.parseDoubleでサポートされず、NumberFormatExceptionがスローされます。 DecimalFormatのformatparseの両方を使用する必要があります。
  • また、System.out.printlnの場合はダブル値を直接使用します。 DecimalFormat.formatの結果を連結して、あなたが望むものを正確に達成しないのはなぜですか?例えば。 System.out.println(df.format(a) + " ** " + df.format(b) + " ** " + df.format(c));
  • 実際の数学的な四捨五入(追加の計算のために二重の値を必要とするなど)を行う場合は、Math.roundを使用してください。希望の精度を達成するために、10,100,1000などで掛けることができます。 doubleデータ型の場合、正確なの丸めを行うことはできません。
1

を与え、あなたはBigIntegerまたはBigDecimal

DecimalFormat df = new DecimalFormat("#.000"); 
df.setRoundingMode(RoundingMode.FLOOR); 

BigDecimal a = new BigDecimal(43.473); 
BigDecimal b = a.pow(10); 

System.out.println(df.format(a) + " ** " + b.doubleValue() + " ** " + df.format(b)); 

を使用する必要がありますこれは

43.472 ** 2.4109939006965688E16 ** 24109939006965686.655 
関連する問題