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 倍左右。

注意:此舍入器仅用于舍入到正小数位(或 0)。

这个新的圆角器有什么我没有看到的问题吗?

谢谢,

4

1 回答 1

11

Math#round方法不坏。138.515不能完全表示为双精度。要查看确切的值,您可以使用:

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

打印:

138.5149999999999863575794734060764312744140625

因此,round 返回 138.51 是准确的。如果您需要比双精度更高的精度,您可以使用 BigDecimal。


编辑

如果 BigDecimal 不是一个选项,并且小数位数很小(比如 3 或 4,因为这些是价格),您可以使用 longs 而不是最后 4 位数字作为小数。所以 138.51d 将改为 1385100L。

于 2013-08-14T09:38:42.897 回答