2011-10-21 52 views
5

我有这样一个值:如何将数字四舍五入到一定范围内?

421.18834 

我不得不带着面具可以是这样的正确详谈数学:

0.05 
0.04 
0.1 

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

,我发现使用谷歌没有工作的所有功能。

你能帮我吗?

回答

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

应此'(INT)(初始/范围)'轮正确?正如我在几个月前看到的那样,这只是削减小数点而不是四舍五入(我猜也是一样)。如果我使用Math.round,它可以工作。 –

+0

看起来,我的Java有点生疏:-)但''Math.round()'*将*正确地做到这一点! – fredley

3

您不需要特殊功能。您将原始数字乘以(1/mask),将其四舍五入为小数点,然后再以相同因子进行分割。

  • 实施例用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

注意:在Java中,'4212/10'不会生成'421.20'! – fredley

2

两个fredley和利玛使假定四舍五入因子本身是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; 
} 
1

相反,你可能会得到大约这里乘除的答案,你不能这样做,因为准确浮点没有小数。需要转换为十进制基数然后四舍五入。 BigDecimal会这样做。