2010-07-19 12 views
24

Jak można zaokrąglić liczbę do najbliższej wartości X (na przykład 50)celem-C okrągły numer dokładnością do 50

tj 47 będzie 50

24 będzie wynosiła 0,

74 byłoby 50

99 będzie 100

etc ...

Naprawdę nie mam pojęcia, gdzie zacząć szukać sposobu, aby to zrobić ...

P.S. Im przy cocoa-touch dla iPhone

dzięki dużo Mark

Odpowiedz

50

to zrobić:

50.0 * floor((Number/50.0)+0.5) 
+3

Albo „The w ten sam sposób, możesz zrobić to w C "... –

+0

dzięki obiema sposobom działa dobrze – Mark

+1

50 * podłoga ((liczba/50) +0,5) może być trochę lepiej. – djschwartz

13

Dzielenie przez 50, zaokrąglić do najbliższej liczby całkowitej, i pomnożyć przez 50.

6

Jeśli liczba jest dodatnia: 50 * podłoga (liczba/50 + 0,5);

Jeśli liczba jest ujemna: 50 * ceil (liczba/50 - 0,5);

1

Chciałbym zaproponować mniej eleganckie, choć bardziej precyzyjne rozwiązanie; działa tylko dla liczb docelowych.

Ten przykład zaokrągla podaną liczbę sekund do następnego pełnego 60:

int roundSeconds(int inDuration) { 

    const int k_TargetValue = 60; 
    const int k_HalfTargetValue = k_TargetValue/2; 

    int l_Seconds = round(inDuration);       // [MININT .. MAXINT] 
    int l_RemainingSeconds = l_Seconds % k_TargetValue;   // [-0:59 .. +0:59] 
    if (ABS(l_RemainingSeconds) < k_HalfTargetValue) {   // [-0:29 .. +0:29] 
     l_Seconds -= l_RemainingSeconds;       // --> round down 
    } else if (l_RemainingSeconds < 0) {       // [-0:59 .. -0:30] 
     l_Seconds -= (k_TargetValue - ABS(l_RemainingSeconds)); // --> round down 
    } else {              // [+0:30 .. +0:59] 
     l_Seconds += (k_TargetValue - l_RemainingSeconds);  // --> round up 
    } 

    return l_Seconds; 
} 
7

Więc, łącząc what've zostało powiedziane tutaj, tutaj jest ogólnie funkcja:

float RoundTo(float number, float to) 
{ 
    if (number >= 0) { 
     return to * floorf(number/to + 0.5f); 
    } 
    else { 
     return to * ceilf(number/to - 0.5f); 
    } 
}