将浮点数舍入到 2 位小数的最佳做法是什么?

2022-08-31 08:52:27

我正在使用eclipse + Android SDK。

我需要将浮点数值舍入为2位小数。我通常使用数学库的下一个“技巧”。

float accelerometerX = accelerometerX * 100;
    accelerometerX = round(accelerometerX);
    Log.d("Test","" + accelerometerX/100);

但我觉得这不是最好的方法。

是否有库来执行这些类型的操作?


答案 1

2年前,我正在Java中处理统计学,我仍然得到了一个函数的代码,该函数允许您将数字四舍五入到您想要的小数位数。现在你需要两个,但也许你想尝试用3来比较结果,这个函数给了你这种自由。

/**
* Round to certain number of decimals
* 
* @param d
* @param decimalPlace
* @return
*/
public static float round(float d, int decimalPlace) {
    BigDecimal bd = new BigDecimal(Float.toString(d));
    bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);
    return bd.floatValue();
}

您需要决定是向上舍入还是向下舍入。在我的示例代码中,我正在四舍五入。

希望它有帮助。

编辑

如果你想在小数为零时保留小数位数(我猜它只是为了向用户显示),你只需要将函数类型从浮点数更改为BigDecimal,如下所示:

public static BigDecimal round(float d, int decimalPlace) {
    BigDecimal bd = new BigDecimal(Float.toString(d));
    bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);       
    return bd;
}

然后以这种方式调用该函数:

float x = 2.3f;
BigDecimal result;
result=round(x,2);
System.out.println(result);

这将打印:

2.30

答案 2

让我们测试3种方法:
1)

public static double round1(double value, int scale) {
    return Math.round(value * Math.pow(10, scale)) / Math.pow(10, scale);
}

2)

public static float round2(float number, int scale) {
    int pow = 10;
    for (int i = 1; i < scale; i++)
        pow *= 10;
    float tmp = number * pow;
    return ( (float) ( (int) ((tmp - (int) tmp) >= 0.5f ? tmp + 1 : tmp) ) ) / pow;
}

3)

public static float round3(float d, int decimalPlace) {
    return BigDecimal.valueOf(d).setScale(decimalPlace, BigDecimal.ROUND_HALF_UP).floatValue();
}



数字为 0.23453f
我们将测试每种方法 100,000 次迭代。

结果:
时间 1 - 18 毫秒
时间 2 - 1 毫秒
时间 3 - 378 毫秒


在便携式电脑
英特尔 i3-3310M CPU 2.4GHz 上进行测试