118

私は最近数値を扱っていましたが、データベースに格納されている値に応じて、double 値の精度を 6 桁または 4 桁に設定したい状況がありました。

たとえば、データベースで精度が 4 桁に設定されている場合、出力は次のようになります。

10.0000.

DecimalFormatstring を使用してみまし##.####たが、毎回記号を使用するのは面倒です。

より良いアプローチはありますか、以下のように言ってください:

Double value = 10.0;
value.setPrecision(4);
4

11 に答える 11

320

この目的のためにBigDecimalを試すことができます

Double toBeTruncated = new Double("3.5789055");

Double truncatedDouble = BigDecimal.valueOf(toBeTruncated)
    .setScale(3, RoundingMode.HALF_UP)
    .doubleValue();
于 2014-02-06T07:17:32.923 に答える
67

これを行う簡単な方法は次のとおりです。

String formato = String.format("%.2f");

精度を 2 桁に設定します。

印刷するだけの場合は、次のように使用します。

System.out.printf("%.2f",123.234);
于 2013-10-23T21:20:14.257 に答える
3

との精度はdouble、サイズとIEEE 浮動小数点型の実装float方法によって決まります。

一方、出力の 10 進数の桁数はフォーマットの問題です。同じ定数を何度も入力するのは悪い考えです。代わりに文字列定数を宣言し、その記号表現を使用する必要があります。

private static final String DBL_FMT = "##.####";

シンボリック表現を使用すると、コードを検索しなくても、定数が使用されているすべての場所で精度を変更できます。

于 2013-02-13T03:37:22.510 に答える
2
BigDecimal value = new BigDecimal(10.0000);
value.setScale(4);
于 2014-12-16T23:17:27.703 に答える
1

@EJPを拡張するために、doubleを処理するときの「精度」の概念は非常に複雑です。https://stackoverflow.com/a/3730040/390153で説明されているように、精度に関係なく0.1をdoubleとして表すこともできません。同じ理由で、10進数の1/3を有限の精度で表すことはできません。

解決しようとしている問題を検討し、次のことを検討する必要があります。

a)そもそもダブルスを使用する必要があります。精度が関連する概念である場合、doubleを使用することは間違いである可能性があります。

b)doubleが適切である場合、精度とはどういう意味ですか?表示についてのみ話している場合は、ロジックを表示関数でラップすると、1か所で処理するだけで済みます。すなわち。DRYの原則を適用します。

于 2013-02-13T03:40:34.350 に答える
-1

おそらく、この方法は double 値を正確にするのに役立ちます。

double truncate(double number)
    {
        int integerPart = (int) number;
        double fractionalPart = number - integerPart;
        fractionalPart *= 100;  //It is for upto two decimal values after point.
                                //You can increase the zeros to fulfill your needs.
        int fractPart = (int) fractionalPart;
        fractionalPart = (double) (integerPart) + (double) (fractPart)/100;
        return fractionalPart;
    }

このメソッドにより、精度レベルを設定できます。

double truncate(double number, int precision)
{
    double prec = Math.pow(10, precision);
    int integerPart = (int) number;
    double fractionalPart = number - integerPart;
    fractionalPart *= prec;
    int fractPart = (int) fractionalPart;
    fractionalPart = (double) (integerPart) + (double) (fractPart)/prec;
    return fractionalPart;
}
于 2013-10-06T14:59:06.223 に答える