舍入到小数点后三位的最快方法是什么?

Err*_*404 8 java

SO社区是正确的,在你提出性能问题似乎比我随机猜测的方法更有意义之前分析你的代码:-)我描述了我的代码(非常密集的数学)并没有意识到超过70%的代码显然是在一个我没想到的部分是减速,四舍五入的来源.

static double roundTwoDecimals(double d) {
    DecimalFormat twoDForm = new DecimalFormat("#.###");
    return Double.valueOf(twoDForm.format(d));
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我得到的十进制数通常是.01,.02等.但有时我会得到像.070000000001(我真的只关心0.07,但浮点精度导致我的其他公式导致失败),我只需要前3个小数就可以避免这个问题.

那么有更好/更快的方法吗?

Ada*_*iss 15

舍入(正数)数字的标准方法是这样的:

double rounded = floor(1000 * doubleVal + 0.5) / 1000;
Run Code Online (Sandbox Code Playgroud)

例1:floor(1000 * .1234 + 0.5) / 1000= floor(123.9)/1000= 0.123
例2:floor(1000 * .5678 + 0.5) / 1000= floor(568.3)/1000=0.568

但正如@nuakh评论的那样,你总是会被某种程度上的舍入错误所困扰.如果你想准确小数点后3位,最好的办法是转换为千分之一(即,乘以1000的一切),并使用一个完整的数据类型(int,long,.)

在这种情况下,您将跳过最终除法1000并使用积分值123568进行计算.如果您希望以百分比的形式显示结果,则除以10除以显示:

123→12.3%
568→56.8%