2010-02-19 10 views

risposta

21

x = x - (x % 15) sarebbe una soluzione che non si basa sulla divisione intera.

5

Cosa ne pensi di (x/15) * 15?

+0

Dovrete assicurati che x sia un tipo intero, in primo luogo, comunque ... (O, almeno, cast x/15 in int) –

+0

Finché è un int. –

3

È possibile utilizzare divisione intera -

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

gee ... Devo aver ragione. –

+0

@ No rimborsi Nessun reso: solo se x è un tipo intero ... –

10

Come un metodo di estensione sul datetime

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

usare

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

Assicurati di inserire un modello di fabbrica astratto da qualche parte per un design più disaccoppiato. – Pierreten

+3

Ehi, sono un drogato di metodo di estensione. Non offro scuse: p – johnc

4

Non conosco una chiamata di libreria per questo (come .Round (...)), forse e il metodo di estensione si adatterebbe bene?

Vorrei fare una semplice istruzione IF.

Se la velocità è un problema, provare un'istruzione switch estesa per ogni valore. Usa i test unitari per vedere cosa è più veloce se questo è un problema.

Per essere completa ...

//... 
[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

Poteva anche usare una struttura di derisione per deridere anche l'intero per una migliore testabilità (in più senza tutto il sovraccarico dell'allocazione intera nello stack) – Pierreten

+0

um no ... la tempistica è perché presumo che questo è su un sito web e probabilmente ce ne sono molti, questo è tutto ... –

+0

Questo dà la risposta sbagliata per i numeri negativi. –

0

Questo è dove l'operatore modulo viene in molto utile

number - (number % 15) 
Problemi correlati