如何将数字舍入到一定范围内?

时间:2011-10-21 15:13:25

标签: java rounding

我有这样的价值:

421.18834

我必须使用一个看起来像这样的面具正确地将它数学化:

0.05
0.04
0.1

例如,如果掩码是0.04,我必须得到值421.20,因为.18比.16更接近.20。

我使用Google找到的所有功能都无效。

你能帮帮我吗?

4 个答案:

答案 0 :(得分:9)

double initial = 421.18834;
double range = 0.04;

int factor = Math.round(initial / range); // 10530 - will round to correct value

double result = factor * range; // 421.20

答案 1 :(得分:3)

您不需要特殊功能。您将原始数字乘以(1 /掩码),将其四舍五入为小数,再次除以相同因子。

  • 0.05

    的例子
    factor = 1/0.05 = 20
    421.18834 * 20 =  8423.7668
    int(  8423.7668 ) = 8424
    8424.0 / 20.0 = 421.20
    
  • 0.01

    的例子
    factor = 1/0.1 = 10
    421.18834 * 10 = 4211.8834
    int( 4211.8834 ) = 4212
    4212.0 / 10.0 = 421.20
    

答案 2 :(得分:2)

fredley和Matteo都假设舍入因子本身是100的因子。对于像0.06或0.07这样的因子,这是一个不正确的假设。

这是我的Java例程:

public double rounded(double number, double factor) {
    long integer = (long) number;
    double fraction = number - integer;
    double multiple = (fraction / factor);
    multiple = Math.round(multiple);
    return factor * multiple + integer;
} 

答案 3 :(得分:2)

与所有关于乘法和除法的答案相反,你不能准确地做到这一点,因为浮点没有小数位。需要转换为十进制基数然后舍入。 BigDecimal就是这么做的。