Java舍入错误

时间:2013-08-14 09:35:57

标签: java double rounding

我发现我的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)。

我有没有看到这个新圆的问题?

谢谢,

1 个答案:

答案 0 :(得分:11)

Math#round方法没有被破坏。 138.515无法准确表示为double。要查看确切的值,您可以使用:

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

打印:

138.5149999999999863575794734060764312744140625

因此,回报138.51是准确的。如果你需要比double更精确的精度,你可以使用BigDecimal。


修改

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

相关问题