web-dev-qa-db-ja.com

小数点以下n桁までの浮動小数点数

浮動小数点を "n"小数位にフォーマットする必要があります。

bigDecimalを使おうとしましたが、戻り値が正しくありません...

public static float Redondear(float pNumero, int pCantidadDecimales) {
    // the function is call with the values Redondear(625.3f, 2)
    BigDecimal value = new BigDecimal(pNumero);
    value = value.setScale(pCantidadDecimales, RoundingMode.HALF_EVEN); // here the value is correct (625.30)
    return value.floatValue(); // but here the values is 625.3
}

指定した小数桁数のfloat値を返す必要があります。

FloatではなくDouble値を返す必要があります

207
seba123neo

Float値を渡して、以下を使用することもできます。

String.format("%.2f", floatValue);

ドキュメント

544
Arve

DecimalFormat を見てください。あなたは簡単にそれを使用して数を取り、それに小数点以下の桁数を設定することができます。

編集

39
Nick Campion

これを試してくださいこれは私を大いに助けました

BigDecimal roundfinalPrice = new BigDecimal(5652.25622f).setScale(2,BigDecimal.ROUND_HALF_UP);

結果はroundfinalPriceになります - > 5652.26

16
Anupam

注目すべきは、DecimalFormatコンストラクタの使用はお勧めできません。このクラスのJavadocは次のように述べています。

一般に、NumberFormatファクトリメソッドはDecimalFormat以外のサブクラスを返す可能性があるため、DecimalFormatコンストラクタを直接呼び出さないでください。

https://docs.Oracle.com/javase/8/docs/api/Java/text/DecimalFormat.html

だからあなたがする必要があるのは(例えば):

NumberFormat formatter = NumberFormat.getInstance(Locale.US);
formatter.setMaximumFractionDigits(2);
formatter.setMinimumFractionDigits(2);
formatter.setRoundingMode(RoundingMode.HALF_UP); 
Float formatedFloat = new Float(formatter.format(floatValue));
14
FBB

Nickが言及したDecimalFormatクラスを使った簡単なサンプルです。

float f = 12.345f;
DecimalFormat df = new DecimalFormat("#.00");
System.out.println(df.format(f));

Printステートメントの出力は12.35になります。それはあなたのためにそれを丸めることに注意してください。

6
Tony L.

Kindaは、誰もがそれを実行する直接的な方法を指摘していないことに驚きました。これは十分に簡単です。

double roundToDecimalPlaces(double value, int decimalPlaces)
{
      double shift = Math.pow(10,decimalPlaces);
      return Math.round(value*shift)/shift;
}

確かにこれは半偶数丸めではありません。

その価値があるために、2進数ベースの浮動小数点値と10進数の算術を混在させるときはいつでも、半偶数丸めは混沌として予測不能になります。それができないと確信しています。基本的な問題は、1.105のような値は浮動小数点で正確に表現できないことです。浮動小数点値は1.105000000000001、または1.104999999999999のようになります。そのため、半偶数丸めを実行しようとすると、表現エンコーディングエラーが発生します。

IEEE浮動小数点の実装では、四捨五入が行われますが、10進数の四捨五入ではなく、2進数の四捨五入が行われます。それであなたはおそらく大丈夫です

4
Robin Davies

これははるかに専門的ではなく、はるかに高価な方法ですが、理解しやすく初心者には役立つはずです。

public static float roundFloat(float F, int roundTo){

    String num = "#########.";

    for (int count = 0; count < roundTo; count++){
        num += "0";
    }

    DecimalFormat df = new DecimalFormat(num);

    df.setRoundingMode(RoundingMode.HALF_UP);

    String S = df.format(F);
    F = Float.parseFloat(S);

    return F;
}
2
Ethan Johnson
public static double roundToDouble(float d, int decimalPlace) {
        BigDecimal bd = new BigDecimal(Float.toString(d));
        bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);
        return bd.doubleValue();
    }
2
M. Usman Khan

私はあなたが欲しいものがistだと思う

return value.toString();

戻り値を使って表示します。

value.floatValue();

それは主に何かを計算するために使用されるため、常に625.3を返します。

1
n3utrino

私はこの質問に対する答えを探していて、後で方法を開発しました! :)公正な警告、それは価値を切り上げるものです。

private float limitDigits(float number) {
    return Float.valueOf(String.format(Locale.getDefault(), "%.2f", number));
}
1
Blogger