将整数向下舍入到值

时间:2015-07-20 09:57:29

标签: c# algorithm

我有一个C#函数,它将整个正数或负数舍入到十。例如:19 - > 10; 11 - > 10; 99 - > 90; -11 - > -20; -19 - > -20。 代码:

public int RoundDownTo10(int value)
{
    if ((value < 0) && ((value % 10.0) != 0))
    {
        return (((int)Math.Truncate(value / 10.0)) - 1) * 10;
    }
    else
    {
        return ((int)Math.Truncate(value / 10.0)) * 10;
    }
}

我需要帮助才能创建一个可以向下舍入到参数列表中给出的任何数字的函数。例如: RoundDownToNumber(int value, int roundDownToNumber) {...}

RoundDownToNumber(50, 30) -> 30;
RoundDownToNumber(20, 30) -> 0; 
RoundDownToNumber(-1, 30) -> -30; 
RoundDownToNumber(-51, 50) -> -100; 
RoundDownToNumber(149, 50) -> 100;

谢谢。

5 个答案:

答案 0 :(得分:5)

你走了:

public static int RoundDownToNumber(int value, int modulus)
{
    if (value < 0)
        return modulus*((value-modulus+1)/modulus);
    else
        return modulus*(value/modulus);
}

这为您的所有示例输入提供了所需的输出。

答案 1 :(得分:3)

% 10运算符会拆分最后一位数及其符号,可以这么说:34 % 10 == 4-34 % 10 == -4。对于{strong>正数,例如34,我们希望从34转到30,因此我们从中减去最后一位数字:

if (value >= 0)
    return value - value % 10;

对于-34这样的负数,我们想转到-40。我们可以减去模数使我们达到-4的{​​{1}},然后再减去-30,以达到10

-40

现在用变量替换else return value - value % 10 - 10; ,你就完成了。

答案 2 :(得分:1)

你已经完成了整个工作,只需将10切换到roundDownToNumber:

    public int RoundDownToNumber(int value, int roundDownToNumber)
    {
        if ((value < 0) && ((value % roundDownToNumber) != 0))
        {
            return (((int)Math.Truncate((double)value / roundDownToNumber)) - 1) * roundDownToNumber;
        }
        else
        {
            return ((int)Math.Truncate((double)value / roundDownToNumber)) * roundDownToNumber;
        }
    }

答案 3 :(得分:1)

public int RoundDownToNumber(int value, int roundToNumber) {
    return value - ((roundToNumber + (value % roundToNumber)) % roundToNumber);
}

说明:我们必须从价值中减去不必要的盈余。所以我们必须确定不必要的盈余金额。为了不必处理单独的情况,我们将roundToNumber添加到模数中,确保我们得到一个正值,然后我们再次模数,确保我们得到确切需要的值。这是一种类似于公式的单线解决方案。

答案 4 :(得分:-1)

这应该有效

public int RoundDownToValue(int value,int RoundTo)
{
 if(value!=0 && RoundTo !=0)
  {
   int x = (((int)(value / RoundTo)));
   if ((value > 0))
   {       
    return (x*RoundTo);
   }
   else
   {
    return (x*RoundTo)+(RoundTo*(-1));
   }    
 }
}