Floatを小数点以下n桁にフォーマットする


220

浮動小数点数を "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値を返すませんDouble

回答:


561

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

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

ドキュメンテーション


70
String.formatは現在のローカル構成に依存するため、注意してください。セパレータとしてドットを取得できない場合があります。使用をString.format(java.util.Locale.US,"%.2f", floatValue);
推奨

6
この答えはFloat値ではなくString値を与えます、私は良い答えとは思いません。
ZhaoGang 2017年

3
なぜドットをセパレータとして強制するのですか?
マークブイケマ2017年

1
@MarkBuikema規格によって駆動されるドキュメント形式をコンパイルするときなど、絶対に必要な場合があると思います。PDFドキュメント。
Tjaart 2017年

39

を見てみましょう DecimalFormatを。あなたは簡単にそれを使って数を取り、それに小数点以下の設定された数を与えることができます。

編集


1
+1。Android固有のドキュメントは次のとおりです。これらは基本的に同じです。
Zach L

しかし、結果は文字列ではなく浮動小数点数である必要があります。
seba123neo

フロートを丸めたいって言ってるの?通常、フロートの時間精度が重要なのは表示のみです。
Nick Campion

すみません、そうです、私は混乱していました。画面に表示されたときに数字をフォーマットするだけで、以前はそうではありませんでした。それが私の質問でした。どうもありがとう、問題は解決しました。
seba123neo

注目すべきは、DecimalFormatコンストラクターの使用はお勧めしませんNumberFormat。正しい使用法については私の回答を参照してください。
FBB 2016年

17

これを試してみてください

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

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


2
これは、四捨五入してさらにいくつかの計算を行う場合に便利です。それ以外の場合は、Arveの答えがおそらく最良です。
ジェラール2013年

これはGWTでも機能します。String.format()-しません。
AlexV

15

注目すべきは、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));

(たとえば)floatValue = 8.499の場合、これは機能しません。8.5をあげています。
シヴァクリシュナチッパ

3
@ShivakrishnaChippa:はい、ここではコンマの後に2桁が必要であることを指定し、切り上げを行うためです。その場合、8.499は8.5に丸められます。8.499を表示する場合は、最大小数桁として3を設定します。
FBB、

6

DecimalFormatNickが言及したクラスを使用した簡単なサンプルを次に示します。

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

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


注目すべきは、DecimalFormatコンストラクターの使用はお勧めしませんNumberFormat。正しい使用法については私の回答を参照してください。
FBB 2016年

5

簡単な方法で直接実行する方法を誰も指摘していないことに、ちょっと驚いた。

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進の半丸めを行います。だから大丈夫だ


このメソッドもしばらくpow使用しましたが、丸めに使用するにはコストがかかりすぎると思いますか?
Xerus 2017年

実際にパフォーマンスの問題が発生するまで、決して最適化しないでください。速いよりも正しいことの方が重要です。そして、VisaやMastercard(より多くのマシンを投げるだけ)でない限り、制御された丸めのパフォーマンスが問題になるアプリケーションを正直に想像することはできません。そして、pow()は、おそらくround()よりも高速です。
Robin Davies

2
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

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

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;
}

1

私はあなたが欲しいものだと思います

return value.toString();

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

value.floatValue();

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


しかし、私は結果が文字列ではなく浮動小数点数である必要があります。
seba123neo

2
ユーザーにフロートを表示する必要がある場合は、アプリケーションの設計に問題がある可能性があります。通常、フロートは計算に使用され、文字列はユーザ​​ーに表示するために使用されます。
n3utrino 2011年

すみません、そうです、私は混乱していました。画面に表示されたときに数字をフォーマットするだけで、以前はそうではありませんでした。それが私の質問でした。どうもありがとう、問題は解決しました。
seba123neo

1

私はこの質問に対する答えを探していましたが、後にメソッドを開発しました!:)公正な警告です。値を切り上げています。

private float limitDigits(float number) {
    return Float.valueOf(String.format(Locale.getDefault(), "%.2f", number));
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.