Ten problem mnie zabija. W jaki sposób jedno zaokrąglenie liczby UP w Pythonie?
Próbowałem zaokrąglić (liczbę), ale zaokrągliłem liczbę w dół. Przykład:
round(2.3) = 2.0 and not 3, what I would like
Próbowałem int (liczba + .5), ale ponownie zaokrągla liczbę w dół! Przykład:
int(2.3 + .5) = 2
Potem próbowałem zaokrąglić (liczba + .5), ale to nie zadziała w przypadku krawędzi. Przykład:
WAIT! THIS WORKED!
Proszę doradź.
python
floating-point
integer
rounding
python-2.x
bodacydo
źródło
źródło
round(number + .5)
nie działa, jeśli liczba jest liczbą całkowitą.round(3+.5) == 4
, kiedy naprawdę chcesz3
.Odpowiedzi:
Ceil (pułap) Funkcja:
źródło
int(math.ceil(363))
math.ceil
zwraca rzeczywisty obiekt całkowity, a nie tylko obiekt pływający o wartości całkowitej.10000000 * 0.00136 = 13600.000000000002
sufit może znacznie zwiększyćmath.ceil(10000000 * 0.00136) = 13601.0
Wiem, że ta odpowiedź jest na pytanie od jakiegoś czasu, ale jeśli nie chcesz importować matematyki i chcesz po prostu zaokrąglić w górę, to działa dla mnie.
Pierwsza część staje się 4, a druga część przyjmuje wartość „Prawda”, jeśli pozostała część, która dodatkowo Prawda = 1; False = 0. Więc jeśli nie ma reszty, to pozostaje ta sama liczba całkowita, ale jeśli jest reszta, dodaje 1.
źródło
//
do dzielenia liczb całkowitych, więc staje się21 // 5 + (21 % 5 > 0)
.float
s. Miły.Interesujący problem z Python 2.x, o którym należy pamiętać:
Problem polega na tym, że podzielenie dwóch liczb całkowitych w pythonie powoduje powstanie kolejnej liczby wewnętrznej, która jest obcięta przed wywołaniem pułapu. Musisz ustawić jedną wartość jako zmiennoprzecinkową (lub rzutową), aby uzyskać poprawny wynik.
W javascript ten sam kod daje inny wynik:
źródło
Jeśli pracujesz z liczbami całkowitymi, jednym ze sposobów zaokrąglania w górę jest skorzystanie z faktu, że
//
zaokrągla w dół: po prostu wykonaj podział na liczbę ujemną, a następnie zaneguj odpowiedź. Nie jest wymagany import, zmiennoprzecinkowy ani warunkowy.Na przykład:
źródło
(num + den - 1) // den
, co jest dobre w przypadkuint
danych wejściowych z dodatnimi mianownikami, ale kończy się niepowodzeniem, jeślifloat
zaangażowana jest nawet pojedyncza niecałkowita (licznik lub mianownik); jest to bardziej magicznie wyglądające, ale działa zarówno naint
s, jak i nafloat
s. W przypadku małych liczników jest on również szybszy (w CPython 3.7.2), choć dziwnie, gdy tylko licznik jest wystarczająco duży, aby potrzebować matematyki opartej na tablicy, twoje podejście jest wolniejsze; nie jest jasne, dlaczego tak jest, ponieważ podział pracy powinien być podobny, a dwa jednoznaczne negacje powinny być tańsze niż dodawanie + odejmowanie.Możesz także polubić numpy:
Nie twierdzę, że to lepsze niż matematyka, ale jeśli już używałeś numpy do innych celów, możesz zachować spójność kodu.
W każdym razie tylko szczegół, z którym się spotkałem. Często używam numpy i byłem zaskoczony, że nie wspomniano o nim, ale oczywiście zaakceptowana odpowiedź działa doskonale.
źródło
Użyj,
math.ceil
aby zaokrąglić w górę:UWAGA : Wejście powinno być zmiennoprzecinkowe.
Jeśli potrzebujesz liczby całkowitej, zadzwoń,
int
aby ją przekonwertować:BTW, użyj,
math.floor
aby zaokrąglić w dół iround
zaokrąglić do najbliższej liczby całkowitej.źródło
ceil()
zajmie się tym wewnętrznieSkładnia może nie być tak pythoniczna, jak by się mogło wydawać, ale jest to potężna biblioteka.
https://docs.python.org/2/library/decimal.html
źródło
Dziwię się, że nikt nie zasugerował
do dzielenia liczb całkowitych z zaokrąglaniem w górę. Kiedyś był powszechnym sposobem dla C / C ++ / CUDA (por.
divup
)źródło
1
przed wykonaniem matematyki należy go dodać zamiast odjąć lub odwrócić znaki zarówno licznika, jak i mianownika.Zaokrąglona wartość powinna być zmienna
ale
źródło
Spróbuj tego:
źródło
((int(a) - a) != 0)
powroty ekspresji1
, gdya
musi być zaokrąglone. Możesz poszerzyć swoją odpowiedź i wyjaśnić, jak to działa.Ta funkcja nie wymaga modułów.
źródło
3
, to zaokrągliby w górę do tego,4
co może lub nie być tym, czego ktoś chcePowyższe odpowiedzi są poprawne, jednak importowanie
math
modułu tylko dla tej jednej funkcji zwykle wydaje mi się przesadą. Na szczęście istnieje inny sposób:True
iFalse
są interpretowane jako1
oraz0
w instrukcji zawierającej liczby w pythonie.g.is_interger()
w zasadzie tłumaczy się nag.has_no_decimal()
lubg == int(g)
. Tak więc ostatnie zdanie w języku angielskim brzmiround g down and add one if g has decimal
.źródło
int(g) + (g % 1 > 0)
zamiast tego ;-)from math import ceil
wydaje się naprawić importowanie całego modułu matematycznego :)import math
od tego, co dzieje się za kulisami. Po prostu upuszcza wszystkie symbole opróczceil
.Bez importowania matematyki // przy użyciu podstawowego środowiska:
a) metoda / metoda klasy
b) lambda:
źródło
Dla tych, którzy chcą zaokrąglić w górę
a / b
i uzyskać liczbę całkowitą:Innym wariantem wykorzystującym dzielenie liczb całkowitych jest
źródło
Jeśli ktoś chce zaokrąglić w górę do określonego miejsca po przecinku:
źródło
Dziwię się, że jeszcze nie widziałem tej odpowiedzi
round(x + 0.4999)
, więc odłożę ją. Zauważ, że działa to z każdą wersją Pythona. Zmiany wprowadzone w schemacie zaokrąglania w Pythonie utrudniają pracę. Zobacz ten post .Bez importowania używam:
Dlaczego to działa
Z dokumentów
Dlatego 2,5 zostaje zaokrąglone do 2, a 3,5 zaokrąglone do 4. Jeśli tak nie było, zaokrąglanie w górę można wykonać, dodając 0,5, ale chcemy uniknąć dotarcia do połowy. Tak więc, jeśli dodasz 0,4999, zbliżysz się, ale z wystarczającym marginesem, aby zostać zaokrąglonym do tego, czego normalnie byś oczekiwał. Oczywiście to się nie powiedzie, jeśli
x + 0.4999
jest równe[n].5000
, ale jest to mało prawdopodobne.źródło
math.ceil()
?Without importing I use:
. Wspomniałem również, że to się nie powiedzie, jeślix + 0.4999
jest równe[n].5000
.math
Moduł imath.ceil()
jest w bibliotece standardowej, więc wszędzie dostępne dla wszystkich praktycznych celów bez instalowania dodatkowych rzeczy. A jeśli chodzi o twoją wzmiankę o tym, kiedy zawodzi, nie jest to kompletna odpowiedź, ponieważ zawodzi przez cały okres, a nie tylko przez jeden punkt. Technicznie rzecz biorąc, można argumentować, masz rację, jak mówisz , jeśli nie wtedy i tylko wtedy , ale to zrobi wrażenie na przypadkowego czytelnika, że jest mniej prawdopodobne, niż jest w rzeczywistości.Aby to zrobić bez importu:
źródło
Wiem, że to już dawno temu, ale znalazłem dość interesującą odpowiedź, więc oto:
Naprawia to przypadki krawędzi i działa zarówno dla liczb dodatnich, jak i ujemnych i nie wymaga importu żadnej funkcji
Twoje zdrowie
źródło
-round(-x-0.3) = x
kiedy operujesz 4500/1000 w Pythonie, wynik będzie wynosił 4, ponieważ dla domyślnego Pythona przyjmujemy jako liczbę całkowitą wynik, logicznie: 4500/1000 = 4.5 -> int (4.5) = 4 i pułap 4 oczywiście wynosi 4
przy użyciu 4500 / 1000.0 wynik wyniesie 4,5, a pułap 4,5 -> 5
Za pomocą javascript otrzymasz 4.5 jako wynik 4500/1000, ponieważ javascript przyjmuje tylko wynik jako „typ liczbowy” i zwraca wynik bezpośrednio jako zmiennoprzecinkowy
Powodzenia!!
źródło
/
zawsze powoduje liczbę zmiennoprzecinkową, więc4500/1000
zawsze wynosi 4.5.Jeśli nie chcesz niczego importować, zawsze możesz napisać własną prostą funkcję jako:
def RoundUP(num): if num== int(num): return num return int(num + 1)
źródło
Możesz użyć podziału podłogi i dodać do niego 1. 2,3 // 2 + 1
źródło
ceil()
zamiast dziwnie robić coś przeciwnego, a następnie zrekompensowaćfrom math import ceil; assert 4 // 2 + 1 == ceil(4 / 2)
Myślę, że mylisz mechanizmy robocze między
int()
iround()
.int()
zawsze obcina liczby dziesiętne, jeśli podano liczbę zmiennoprzecinkową; podczas gdyround()
w przypadku2.5
gdzie2
i3
oba są w równej odległości2.5
, Python zwraca cokolwiek, co jest bardziej oddalone od punktu 0.źródło
2.3
zmienia się w3
, co nie dzieje się w żadnym z twoich przykładów.Moja część
Testowałem
print(-(-101 // 5)) = 21
podany przykład powyżej.Teraz do zaokrąglania w górę:
Nie mogę użyć,
**
więc podzielę mnożnik na dział:źródło
Jestem w zasadzie początkującym w Python, ale jeśli próbujesz zaokrąglić w górę zamiast w dół, dlaczego nie:
źródło
round(integer + 0.5)
To, co często robię