Risposte:
Non conosco una funzione standard in Python, ma questo funziona per me:
def myround(x, base=5):
return int(base * round(float(x)/base))
def myround(x, base=5):
return base * round(x/base)
È facile capire perché funzioni sopra. Vuoi assicurarti che il tuo numero diviso per 5 sia un numero intero, arrotondato correttamente. Quindi, prima facciamo esattamente questo ( round(float(x)/5)
dove float
è necessario solo in Python2), e poi, poiché abbiamo diviso per 5, moltipliciamo anche per 5. La conversione finale in int
è perchéround()
restituisce un valore in virgola mobile in Python 2.
Ho reso la funzione più generica assegnandole un base
parametro, il cui valore predefinito è 5.
floor()
e ceil()
piuttosto che lanciare:base * floor(x/base)
math.floor
e math.ceil
non consentire l'utilizzo con una base personalizzata, quindi la preferenza è irrilevante.
Per arrotondare a valori non interi, come 0,05:
def myround(x, prec=2, base=.05):
return round(base * round(float(x)/base),prec)
L'ho trovato utile poiché potevo semplicemente fare una ricerca e sostituirlo nel mio codice per cambiare "round (" in "myround (", senza dover cambiare i valori dei parametri.
def my_round(x, prec=2, base=0.05): return (base * (np.array(x) / base).round()).round(prec)
che accetta anche array intorpiditi.
Rimuovere il 'resto' funzionerebbe:
rounded = int(val) - int(val) % 5
Se il valore è areao un numero intero:
rounded = val - val % 5
Come una funzione:
def roundint(value, base=5):
return int(value) - int(value) % int(base)
round (x [, n]): i valori sono arrotondati al multiplo più vicino di 10 alla potenza meno n. Quindi se n è negativo ...
def round5(x):
return int(round(x*2, -1)) / 2
Poiché 10 = 5 * 2, è possibile utilizzare la divisione e la moltiplicazione di numeri interi con 2, anziché la divisione e la moltiplicazione float con 5.0. Non è molto importante, a meno che non ti piaccia spostare un po '
def round5(x):
return int(round(x << 1, -1)) >> 1
Mi dispiace, ho voluto commentare la risposta di Alok Singhai, ma non mi lascerà a causa della mancanza di reputazione = /
Ad ogni modo, possiamo generalizzare un altro passo e andare:
def myround(x, base=5):
return base * round(float(x) / base)
Questo ci consente di utilizzare basi non intere, come .25
o qualsiasi altra base frazionaria.
Versione modificata di divround :-)
def divround(value, step, barrage):
result, rest = divmod(value, step)
return result*step if rest < barrage else (result+1)*step
Uso:
>>> def round_to_nearest(n, m):
r = n % m
return n + m - r if r + r >= m else n - r
Non utilizza la moltiplicazione e non converte da / a float.
Arrotondamento al multiplo più vicino di 10:
>>> for n in range(-21, 30, 3): print('{:3d} => {:3d}'.format(n, round_to_nearest(n, 10)))
-21 => -20
-18 => -20
-15 => -10
-12 => -10
-9 => -10
-6 => -10
-3 => 0
0 => 0
3 => 0
6 => 10
9 => 10
12 => 10
15 => 20
18 => 20
21 => 20
24 => 20
27 => 30
Come puoi vedere, funziona sia con numeri negativi che positivi. I legami (ad es. -15 e 15) saranno sempre arrotondati verso l'alto.
Un esempio simile che viene arrotondato al multiplo più vicino di 5, dimostrando che si comporta anche come previsto per una "base" diversa:
>>> for n in range(-21, 30, 3): print('{:3d} => {:3d}'.format(n, round_to_nearest(n, 5)))
-21 => -20
-18 => -20
-15 => -15
-12 => -10
-9 => -10
-6 => -5
-3 => -5
0 => 0
3 => 5
6 => 5
9 => 10
12 => 10
15 => 15
18 => 20
21 => 20
24 => 25
27 => 25
Nel caso in cui qualcuno abbia bisogno di "arrotondamenti finanziari" (0,5 arrotondamenti sempre in alto):
def myround(x, base=5):
roundcontext = decimal.Context(rounding=decimal.ROUND_HALF_UP)
decimal.setcontext(roundcontext)
return int(base *float(decimal.Decimal(x/base).quantize(decimal.Decimal('0'))))
Come da documentazione, altre opzioni di arrotondamento sono:
ROUND_CEILING (verso l'Infinito),
ROUND_DOWN (verso lo zero),
ROUND_FLOOR (verso -Infinito),
ROUND_HALF_DOWN (al più vicino con i legami che vanno verso lo zero),
ROUND_HALF_EVEN (al più vicino con i legami che vanno al più vicino pari intero),
ROUND_HALF_UP (al più vicino con legami in corso) lontano da zero) o
ROUND_UP (lontano da zero).
ROUND_05UP (lontano da zero se l'ultima cifra dopo l'arrotondamento verso zero sarebbe stata 0 o 5; altrimenti verso zero)
Per impostazione predefinita, Python utilizza ROUND_HALF_EVEN in quanto presenta alcuni vantaggi statistici (i risultati arrotondati non sono distorti).
Per numeri interi e con Python 3:
def divround_down(value, step):
return value//step*step
def divround_up(value, step):
return (value+step-1)//step*step
Produrre:
>>> [divround_down(x,5) for x in range(20)]
[0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 10, 10, 10, 10, 10, 15, 15, 15, 15, 15]
>>> [divround_up(x,5) for x in range(20)]
[0, 5, 5, 5, 5, 5, 10, 10, 10, 10, 10, 15, 15, 15, 15, 15, 20, 20, 20, 20]
Che dire di questo:
def divround(value, step):
return divmod(value, step)[0] * step
Ecco il mio codice C. Se lo capisco correttamente, dovrebbe essere qualcosa del genere;
#include <stdio.h>
int main(){
int number;
printf("Enter number: \n");
scanf("%d" , &number);
if(number%5 == 0)
printf("It is multiple of 5\n");
else{
while(number%5 != 0)
number++;
printf("%d\n",number);
}
}
e questo arrotonda anche al multiplo più vicino di 5 invece di arrotondare per eccesso;
#include <stdio.h>
int main(){
int number;
printf("Enter number: \n");
scanf("%d" , &number);
if(number%5 == 0)
printf("It is multiple of 5\n");
else{
while(number%5 != 0)
if (number%5 < 3)
number--;
else
number++;
printf("nearest multiple of 5 is: %d\n",number);
}
}
Un altro modo per farlo (senza espliciti operatori di moltiplicazione o divisione):
def rnd(x, b=5):
return round(x + min(-(x % b), b - (x % b), key=abs))
Puoi "ingannare" int()
per arrotondare invece di arrotondare per eccesso aggiungendo 0.5
al numero a cui passi int()
.
x // base * base