Czy istnieje wbudowana funkcja, która może zaokrąglać w następujący sposób?
10 -> 10
12 -> 10
13 -> 15
14 -> 15
16 -> 15
18 -> 20
Nie znam standardowej funkcji w Pythonie, ale to działa dla mnie:
def myround(x, base=5):
return int(base * round(float(x)/base))
def myround(x, base=5):
return base * round(x/base)
Łatwo zobaczyć, dlaczego powyższe działa. Chcesz się upewnić, że Twoja liczba podzielona przez 5 jest liczbą całkowitą, prawidłowo zaokrągloną. Więc najpierw robimy dokładnie to ( round(float(x)/5)
gdzie float
jest to potrzebne tylko w Pythonie2), a następnie, ponieważ podzieliliśmy przez 5, mnożymy również przez 5. Ostateczna konwersja do int
jest taka, ponieważ round()
zwraca wartość zmiennoprzecinkową w Pythonie 2.
Uczyniłem funkcję bardziej ogólną, nadając jej base
parametr, domyślnie 5.
x // base * base
floor()
iceil()
zamiast przesyłać:base * floor(x/base)
math.floor
imath.ceil
nie zezwalaj na używanie z niestandardową bazą, więc preferencja nie ma znaczenia.Aby zaokrąglić do wartości niecałkowitych, takich jak 0,05:
Okazało się to przydatne, ponieważ mogłem po prostu przeprowadzić wyszukiwanie i zamienić w moim kodzie, aby zmienić „round (” na „myround (”) bez konieczności zmiany wartości parametrów.
źródło
def my_round(x, prec=2, base=0.05): return (base * (np.array(x) / base).round()).round(prec)
który akceptuje również tablice numpy.To tylko kwestia skalowania
źródło
Usunięcie „reszty” zadziałałoby:
Jeśli wartość jest równa liczbie całkowitej:
Jako funkcja:
źródło
źródło
round (x [, n]): wartości są zaokrąglane do najbliższej wielokrotności 10 do potęgi minus n. Więc jeśli n jest ujemne ...
Ponieważ 10 = 5 * 2, zamiast dzielenia liczb zmiennoprzecinkowych i mnożenia przez 5,0 można użyć dzielenia liczb całkowitych i mnożenia przez 2. Nie ma to większego znaczenia, chyba że lubisz trochę zmieniać
źródło
Przepraszam, chciałem skomentować odpowiedź Aloka Singhai, ale nie pozwala mi na to z powodu braku reputacji = /
W każdym razie możemy uogólnić jeszcze jeden krok i przejść:
To pozwala nam używać niecałkowitych baz, takich jak
.25
lub dowolnej innej podstawy ułamkowej.źródło
Zmodyfikowana wersja divround :-)
źródło
Posługiwać się:
Nie używa mnożenia i nie konwertuje z / na liczby zmiennoprzecinkowe.
Zaokrąglanie do najbliższej wielokrotności liczby 10:
Jak widać, działa to zarówno dla liczb ujemnych, jak i dodatnich. Remisy (np. -15 i 15) zawsze będą zaokrąglane w górę.
Podobny przykład, który zaokrągla do najbliższej wielokrotności liczby 5, pokazując, że również zachowuje się zgodnie z oczekiwaniami dla innej „bazy”:
źródło
Jeśli ktoś potrzebuje „zaokrąglenia finansowego” (0,5 zaokrąglenia zawsze w górę):
Zgodnie z dokumentacją inne opcje zaokrąglania to:
Domyślnie Python używa ROUND_HALF_EVEN, ponieważ ma pewne zalety statystyczne (zaokrąglone wyniki nie są obciążone).
źródło
Dla liczb całkowitych i Python 3:
Produkcja:
źródło
A co z tym:
źródło
Następna wielokrotność 5
Rozważmy, że 51 należy przekonwertować na 55:
źródło
Oto mój kod C. Jeśli dobrze to rozumiem, powinno to być coś takiego;
i to również zaokrągla do najbliższej wielokrotności liczby 5 zamiast tylko zaokrąglać w górę;
źródło
Inny sposób, aby to zrobić (bez jawnych operatorów mnożenia lub dzielenia):
źródło
int()
Zamiast zaokrąglania w dół możesz „oszukać”, dodając0.5
do podanej liczbyint()
.źródło