2010-02-19 4 views

ответ

21

x = x - (x % 15) будет решение, которое не зависит на целочисленном делении.

5

Как насчет (x/15) * 15?

+0

Вы должны будете убедитесь, что x является целым типом, во-первых, однако ... (или, по крайней мере, литой x/15 в int) –

+0

Пока это int. –

3

Вы можете использовать целочисленное деление -

int number = 43; 
int newNumber = number/15; 
int rounded = newNumber * 15; 
+1

gee ... Должно быть, я прав. –

+0

@No Refunds No Returns: Только если x является целым типом ... –

10

В качестве метода расширения на DateTime

public static DateTime RoundDown(this DateTime dateTime) 
{ 
    return new DateTime(dateTime.Year, dateTime.Month, 
     dateTime.Day, dateTime.Hour, (dateTime.Minute/15) * 15, 0); 
} 

использовать

DateTime date = dateTime.Now.RoundDown();//for example 
+3

Удостоверьтесь, что он соответствует абстрактному шаблону фабрики где-то для более развязанного дизайна. – Pierreten

+3

Эй, я наркоман расширения. Я не предлагаю никаких извинений: p – johnc

4

Я не знаю, как зовут библиотеку для этого (например .Round (...)), возможно, и метод расширения подойдет хорошо?

Я хотел бы получить простой оператор IF.

Если скорость является проблемой, попробуйте расширенный оператор switch для каждого значения. Используйте модульные тесты, чтобы узнать, что быстрее, если это проблема.

Чтобы быть полным ...

//... 
[TestMethod] 
    public void round_down() 
    { 
     Assert.AreEqual(-5.RoundDown(), 0); 
     Assert.AreEqual(0.RoundDown(), 0); 
     Assert.AreEqual(1.RoundDown(), 0); 
     Assert.AreEqual(20.RoundDown(), 15); 
     Assert.AreEqual(42.RoundDown(), 30); 
     Assert.AreEqual(48.RoundDown(), 45); 
     Assert.AreEqual(59.RoundDown(), 45); 
     Assert.AreEqual(90.RoundDown(), 45); 
    } 

// ...

public static class Ext 
{ 
    public static int RoundDown(this int val) 
    { 
     if (val < 0) 
      return 0; 
     if (val < 15) 
      return 0; 
     if (val < 30) 
      return 15; 
     if (val < 45) 
      return 30; 
     return 45; 
    } 
} 
+2

Он также может использовать фальшивую фреймворк, чтобы издеваться над целым, чтобы лучше тестировать (плюс без всех накладных расходов на выделение целых чисел в стеке). – Pierreten

+0

um no ... момент времени заключается в том, что я предполагаю, что это на веб-сайте, и, вероятно, много этого происходит, вот и все ... –

+0

Это дает неправильный ответ для отрицательных чисел. –

0

Это где оператор модуль поставляется в очень удобной

number - (number % 15)