2015-07-20 4 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, мы хотим, чтобы перейти от 34 к 30, поэтому мы вычитаем последнюю цифру от него:

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 к модулю, следя за тем, чтобы мы получили положительное значение, а затем снова по модулю, убедившись, что мы получаем точное значение. Это однострочное, формулоподобное решение.

Смежные вопросы