2015-07-20 61 views
1

我有一个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; 

谢谢。

+0

你究竟想要什么?您的要求与第二个代码 –

+0

中给出的方法不匹配您是否可以简单地将正值“值”减去“值%10”,对“负值”值减去“值%10 + 10”? – Lynn

+2

四舍五入到10,代码使用值“10.0”和“10”四次......你有没有尝试过任何东西? – Orace

回答

5

在这里你去:

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

这为所有例如输入所需的输出。

+0

不错的一个。请检查我的单行。 –

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

% 10运营商将分离出来的最后一个数字和它的符号,可以这么说:34 % 10 == 4-34 % 10 == -4。对于正数34,我们要去从3430,所以我们从它减去最后一个数字:

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

对于负数-34,我们想去-40。我们可以减去模给我们的-4达到-30,然后减去10更多,达到-40

else 
    return value - value % 10 - 10; 

现在用一个变量替换10,就大功告成了。

+1

这是做到这一点的方法。精度问题没有浮点值。没有昂贵的分工/乘法与不确定性结果。 – Orace

+1

@Orace你认为'%'操作符在其实现中没有划分吗? –

+0

嗯,它没有*浮点*部门,这是我认为@Orace担心的。 – Lynn

-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)); 
    }  
} 
} 
1
public int RoundDownToNumber(int value, int roundToNumber) { 
    return value - ((roundToNumber + (value % roundToNumber)) % roundToNumber); 
} 

解释:我们必须从价值减去不必要的盈余。所以我们必须确定不必要的盈余数量。为了不必处理单独的案例,我们将roundToNumber添加到模,确保我们得到一个正值,然后我们再次模,确保我们得到确切需要的值。这是一种单线,类似配方的解决方案。