mag*_*iez 2 java double rounding
我发现我的Java应用程序出现舍入错误.用于舍入的方法是:
public static double round(double value,double precision)
{
return Math.round(value * precision) / precision;
}
Run Code Online (Sandbox Code Playgroud)
这可能有一个错误(即圆形(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;
}
Run Code Online (Sandbox Code Playgroud)
我创建了这种方法,因为其他舍入方法给系统增加了太多的延迟(低延迟系统).这个比前一个快了大约10倍.
注意:此轮组仅用于舍入到正确的decimalPlaces(或0).
这个新的圆领我有没有看到任何问题?
谢谢,
ass*_*ias 11
该Math#round方法没有被打破.138.515不能完全表示为双精度数.要查看确切的值,您可以使用:
System.out.println(new BigDecimal(138.515d));
Run Code Online (Sandbox Code Playgroud)
打印:
138.5149999999999863575794734060764312744140625
Run Code Online (Sandbox Code Playgroud)
因此,回报138.51是准确的.如果你需要比double更精确的精度,你可以使用BigDecimal.
编辑
如果BigDecimal不是一个选项,并且如果小数位数很小(例如3或4,因为这些是价格),您可以使用long而不是最后4位为小数.所以138.51d将是1385100L.
| 归档时间: |
|
| 查看次数: |
3023 次 |
| 最近记录: |