2017-02-09 5 views
0

"。"文字の後に正確に2桁の文字列を入力するには、私は、このような828.054999999702dとして番号を持っている場合は、次の数字は「4」と言うので、それは、これまでに正しいものを828.05にそれをフォーマットすると、それは何もそれを切り捨てます2桁の数字を印刷しますが、6桁の精度で丸めます。

 DecimalFormat df = (DecimalFormat)DecimalFormat.getInstance(Locale.US); 
     df.applyPattern("0.00"); 
     df.setRoundingMode(RoundingMode.HALF_UP); 
     String output = df.format(value); 

:私のような何かを行うことができます。

しかし、数字の精度を維持する必要がある場合は、表示したくない場合はどうすればよいですか?

私がすぐに作成すると、この作業コードです:これは6日、第5回、第4回、第3回次いで第2位を四捨五入します

 double prettyValue = value; 
     prettyValue = Math.round(prettyValue * 1000000d)/1000000d; 
     prettyValue = Math.round(prettyValue * 100000d)/100000d; 
     prettyValue = Math.round(prettyValue * 10000d)/10000d; 
     prettyValue = Math.round(prettyValue * 1000d)/1000d; 
     prettyValue = Math.round(prettyValue * 100d)/100d; 
     DecimalFormat df = (DecimalFormat)DecimalFormat.getInstance(Locale.US); 
     df.applyPattern("0.00"); 
     df.setRoundingMode(RoundingMode.HALF_UP); 
     String output = df.format(prettyValue); 

、のNumberFormatは何もする必要がありますが、単に2が残っている印刷されませんそれ以降はゼロになります。

しかし、私はすでに見ていないすぐに使える丸めがあるはずです。 BigDecimalsで同じことをしようとすると、まったく同じ問題になります。

私が望む結果は828.054999999702828.06に丸めることです。

+0

出力をフォーマットするときに切り捨ててみてください。 – Thomas

+0

* "何桁の精度を保持する必要がある場合、それを表示したくないのですか?"という意味ですか?ディスプレイの書式設定は精度の保持と何が関係していますか?あなたの書式設定されたテキストが保存されている場合は、保存に必要なすべての数字を表示する必要があります。それ以外の場合は値が保持されますが、問題は何ですか?よくわかりません。 – Andreas

答えて

2

私は、私は完全にあなたの質問を理解していないので、私は復習してみましょう:あなたは、潜在的により6よりもかなりの割合の数字といくつかのdouble値を持っている

  • この値を小数点以下6桁に丸め、HALF_UPモードを使用します。
  • 最初の2小数点のみを表示したいのですが(理由は分かりませんが質問はしません)。値1.234568をもたらすべきである

    double value = 1.23456789; 
    BigDecimal rounded = BigDecimal.valueOf(value).setScale(6, RoundingMode.HALF_UP); 
    

    :そうしないと、精度の誤差を得ることができるので、私はあなたが最初の丸めのためBigDecimalを使用することをお勧めしたいような場合には

。あなたは常に切り捨てたよう

その後NumberFormatを使用します。

DecimalFormat df = (DecimalFormat)DecimalFormat.getInstance(Locale.US); 
df.applyPattern("#.##"); 
df.setRoundingMode(RoundingMode.DOWN); 
String output = df.format(rounded); 

1.23になる必要があること。

入力値が4.23499999999235の場合、4.235000(6桁に丸め)と4.23が得られます。

編集:私は4.244.23499999999235を四捨五入していますが、複数のsetScale()呼び出しを連鎖によって、それを達成することができるはず任意の丸めモードを認識していないよ:

BigDecimal rounded = BigDecimal.valueOf(value); 
for(int digit = 6; digit >= 2; digit--) { 
    rounded = rounded .setScale(digit, RoundingMode.HALF_UP); 
} 

分数の桁に丸め適用されるべきであること6、次に5などになり、最後に4.24に丸められます。私はまだそれが正しい方法であるかどうかはわかりませんが、あなたは私よりもあなたの要求をよく知っています:)

+0

これは正しいアイデアのようです。しかし、私はまだHALF_UPを使用する必要があります。そして、結果は私が望んだものは4.24になります。私は質問を編集し、別の番号(デバッグの実際の例)を使用してそれを明確にしました。 – Jens

+0

@Jens「828.xx」は「4.23」のいずれにも丸められないので、もう一度質問を編集したいと思うかもしれません;) – Thomas

+0

@Jensはあなたの説明どおりに少なくとも1つの方法で自分の編集を見ます。 – Thomas

0

考慮すると、あなたが文字列にこれを出力している、なぜ代わりのDecimalFormatもののすべての

String output = String.format(java.util.Locale.US,"%.2f", doubleValue); 

を使うのか?これにより、doubleValueが元の値として残され、精度が維持されます。

+0

これは私のサンプルコードを短くしても何も変わらないでしょう。文字列「出力」には、2桁以上の精度で四捨五入されていない数値が含まれます。文字列形式は、位置3を見て、それらをすべて考慮するのではなく、その4を丸めます。 – Jens

+0

4.2349999を4.24に「切り上げ」しますか?これは間違って四捨五入しているようです。それ以外の場合は、私が2に達するまで、あなたがやったことをして、より高い数字から低い数字に丸めたでしょう。 – igoldthwaite

+0

私は間違った丸めではないと思います。たとえば、金融システムでは、6桁の精度ですべてを計算する制約がありますが、その後は2桁しか表示されません。しかし、財務的には、BigDecimalも使用します。 – Jens

関連する問題