2

Java アプリケーションに丸めエラーがあることがわかりました。丸めに使用された方法は次のとおりです。

 public static double round(double value,double precision)
    {
        return Math.round(value * precision) / precision;
    }

これにはエラーが発生する可能性があります (つまり、round(138.515,100) は 138.52 を返し、138.51 を返す必要があります)。そこで、次のラウンダーを作成しました。

//  Mikeldi's rounder
public static double round2DecimalPlaces(double value,int decimalPlaces)
{
    int s = value<0?-1:1;
    double p = 1;
    for (int i = 0; i < decimalPlaces; i++) {
        p*=10;
    }

    double n = (long) value;
    double d = ((value*10*p)-(n*10*p));
    d +=s*5;
    d /= 10;
    d = (long)d;
    d /= p;
    return d+n;
}

このメソッドを作成したのは、他の丸め方法ではシステムにあまりにも多くのレイテンシが追加されたためです (低レイテンシ システム)。これは、以前よりも約 10 倍高速です。

注: このラウンダーは、正の decimalPlaces (または 0) に丸めるためにのみ使用されます。

この新しいラウンダーで見たことのない問題はありますか?

ありがとう、

4

1 に答える 1

11

Math#roundメソッドは壊れていません。138.515double として正確に表現することはできません。正確な値を確認するには、次を使用できます。

System.out.println(new BigDecimal(138.515d));

これは次を印刷します:

138.5149999999999863575794734060764312744140625

したがって、round が 138.51 を返すのは正確です。double よりも高い精度が必要な場合は、BigDecimal を使用できます。


編集

BigDecimal がオプションではなく、小数点以下の桁数が小さい場合 (たとえば、価格であるため 3 または 4 とします)、代わりに末尾 4 桁を小数点として long を使用できます。したがって、138.51d は代わりに 1385100L になります。

于 2013-08-14T09:38:42.897 に答える