Jak zaokrąglić liczbę w Pythonie?

Ten problem mnie dobija. Jak można zaokrąglać liczbę w Pythonie?

Próbowałem round (numer), ale to zaokrągla numer w dół. Przykład:

round(2.3) = 2.0 and not 3, what I would like

I tried int (liczba + .5) ale to zaokrągla numer w dół ponownie! Przykład:

int(2.3 + .5) = 2

Potem próbowałem round(numer + .5) ale nie będzie działać w skrajnych przypadkach. Przykład:

WAIT! THIS WORKED!
Proszę o radę.
Author: Mr. Me, 2010-03-01

22 answers

Funkcja ceil (sufit):

import math
print(math.ceil(4.2))
 597
Author: Steve Tjoa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-26 09:17:18

[[2]} Ciekawy Python 2.kwestia x do zapamiętania:

>>> import math
>>> math.ceil(4500/1000)
4.0
>>> math.ceil(4500/1000.0)
5.0

Problem polega na tym, że dzielenie dwóch Int w Pythonie powoduje powstanie kolejnego int, który jest obcięty przed wywołaniem sufitu. Aby uzyskać poprawny wynik, musisz uczynić jedną wartość float (lub cast).

W javascript, ten sam kod daje inny wynik:

console.log(Math.ceil(4500/1000));
5
 134
Author: TrophyGeek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-24 07:33:54

Wiem, że ta odpowiedź jest na pytanie sprzed jakiegoś czasu, ale jeśli nie chcesz importować matematyki, a chcesz tylko zaokrąglać, to działa dla mnie.

>>> int(21 / 5)
4
>>> int(21 / 5) + (21 % 5 > 0)
5

Pierwsza część staje się 4, a druga część ocenia na "True", jeśli istnieje reszta, która dodatkowo True = 1; False = 0. Więc jeśli nie ma reszty, to pozostaje ta sama liczba całkowita, ale jeśli jest reszta dodaje 1.

 105
Author: user3074620,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-31 14:56:40

W przypadku pracy z liczbami całkowitymi, jednym ze sposobów zaokrąglania w górę jest wykorzystanie faktu, że // zaokrągla się w dół: po prostu wykonaj podział na liczbę ujemną, a następnie zaneguj odpowiedź. Nie jest potrzebny import, zmiennoprzecinkowy ani warunkowy.

rounded_up = -(-numerator // denominator)

Na przykład:

>>> print(-(-101 // 5))
21
 53
Author: David Bau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-01 08:23:29

Możesz również polubić numpy:

>>> import numpy as np
>>> np.ceil(2.3)
3.0

Nie mówię, że to lepsze niż matematyka, ale jeśli używałeś już numpy do innych celów, możesz zachować spójność kodu.

W każdym razie, to tylko szczegół, na który natknąłem się. Używam numpy dużo i byłem zaskoczony, że nie został wymieniony, ale oczywiście przyjęta odpowiedź działa doskonale.
 43
Author: Lisa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-18 13:20:04

Użycie math.ceil zaokrąglić:

>>> import math
>>> math.ceil(5.4)
6.0

Notatka: wejście powinno być float.

Jeśli potrzebujesz liczby całkowitej, wywołaj int, aby ją przekonwertować:

>>> int(math.ceil(5.4))
6

BTW, użyj math.floordo zaokrąglenia w dół i round do zaokrąglenia do najbliższej liczby całkowitej.

>>> math.floor(4.4), math.floor(4.5), math.floor(5.4), math.floor(5.5)
(4.0, 4.0, 5.0, 5.0)
>>> round(4.4), round(4.5), round(5.4), round(5.5)
(4.0, 5.0, 5.0, 6.0)
>>> math.ceil(4.4), math.ceil(4.5), math.ceil(5.4), math.ceil(5.5)
(5.0, 5.0, 6.0, 6.0)
 21
Author: kennytm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-14 11:05:25

Składnia może nie być tak pythoniczna, jak by się chciało, ale jest potężną biblioteką.

Https://docs.python.org/2/library/decimal.html

from decimal import *
print(int(Decimal(2.3).quantize(Decimal('1.'), rounding=ROUND_UP)))
 8
Author: NuclearPeon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-27 19:21:19

Be shure zaokrąglona wartość powinna być float

a = 8 
b = 21
print math.ceil(a / b)
>>> 0

Ale

print math.ceil(float(a) / b)
>>> 1.0
 7
Author: Alexey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-30 19:27:18

Dziwi mnie, że nikt nie zasugerował]}

(numerator + denominator - 1) // denominator

Dla dzielenia liczb całkowitych z zaokrągleniem w górę. Dawniej był to wspólny sposób dla C / C++ / CUDA (por. divup)

 6
Author: Andreas Schuh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-08 09:52:00
>>> def roundup(number):
...     return round(number+.5)
>>> roundup(2.3)
3
>>> roundup(19.00000000001)
20

Ta funkcja nie wymaga modułów.

 6
Author: PonasM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-21 14:16:13

Powyższe odpowiedzi są poprawne, jednak importowanie modułu math tylko dla tej jednej funkcji zwykle wydaje mi się trochę przesadą. Na szczęście jest inny sposób, aby to zrobić:

g = 7/5
g = int(g) + (not g.is_integer())

True i {[3] } są interpretowane jako 1 i 0 w oświadczeniu zawierającym liczby w Pythonie. g.is_interger() W zasadzie tłumaczy się na g.has_no_decimal() lub g == int(g). Tak więc ostatnia wypowiedź w języku angielskim brzmi round g down and add one if g has decimal.

 4
Author: Nearoo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-05 03:28:44

Bez importowania matematyki / / przy użyciu podstawowego środowiska:

A) Metoda / Metoda klasy

def ceil(fl): 
  return int(fl) + (1 if fl-int(fl) else 0)

def ceil(self, fl): 
  return int(fl) + (1 if fl-int(fl) else 0)

B) lambda:

ceil = lambda fl:int(fl)+(1 if fl-int(fl) else 0)
 4
Author: Kuřátko Zvyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-19 12:09:29

Spróbuj tego:

a = 211.0
print(int(a) + ((int(a) - a) != 0))
 4
Author: user3712978,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-05 00:08:09

Dziwi mnie, że jeszcze nie widziałem tej odpowiedzi, więc ją odłożę. Zauważ, że działa to z każdą wersją Pythona. Zmiany wprowadzone w systemie zaokrąglania Pythona utrudniły sprawę. Zobacz ten post .

Bez importowania używam:

def roundUp(num):
    return round(num + 0.49)

testCases = list(x*0.1 for x in range(0, 50))

print(testCases)
for test in testCases:
    print("{:5.2f}  -> {:5.2f}".format(test, roundUp(test)))

Dlaczego to działa

Z docs

Dla typów wbudowanych obsługujących round (), wartości są zaokrąglane do najbliższej wielokrotności 10 do potęgi minus n; Jeśli dwie wielokrotności są jednakowe blisko, zaokrąglanie odbywa się w kierunku parzystego wyboru

Dlatego 2,5 zaokrągla się do 2, a 3,5 do 4. Gdyby tak nie było, zaokrąglenie można by zrobić dodając 0.5, ale chcemy uniknąć dojścia do półmetka. Tak więc, jeśli dodasz 0.4999, zbliżysz się, ale z wystarczającym marginesem, aby być zaokrąglonym do tego, czego normalnie byś się spodziewał. Oczywiście, to się nie powiedzie, jeśli x + 0.4999 jest równe [n].5000, ale jest to mało prawdopodobne.

 2
Author: Klik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:10

Dla tych, którzy chcą zaokrąglić a / b i uzyskać liczbę całkowitą:

Innym wariantem stosującym dzielenie liczb całkowitych jest

def int_ceil(a, b):
    return (a - 1) // b + 1

>>> int_ceil(19, 5)
4
>>> int_ceil(20, 5)
4
>>> int_ceil(21, 5)
5
 1
Author: Pavel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-16 23:52:26

Aby zrobić to bez żadnego importu:

>>> round_up = lambda num: int(num + 1) if int(num) != num else int(num)
>>> round_up(2.0)
2
>>> round_up(2.1)
3
 0
Author: gorttar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-15 01:25:26

Wiem, że to już jakiś czas temu, ale znalazłem dość ciekawą odpowiedź, więc proszę bardzo:

-round(-x-0.5)

To naprawia przypadki krawędzi i działa zarówno dla liczb dodatnich, jak i ujemnych, i nie wymaga żadnego importowania funkcji

Cheers

 0
Author: Fenmaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-14 08:15:01

Gdy operujesz 4500/1000 w Pythonie, wynik będzie 4, ponieważ dla domyślnego Pythona jako liczba całkowita wynik, logicznie: 4500/1000 = 4,5 --> int(4,5) = 4 i 4

Używając 4500/1000. 0 wynik wyniesie 4,5 i 4,5 -- > 5

Używając javascript otrzymamy 4.5 jako wynik 4500/1000, ponieważ javascript asume tylko wynik jako "typ numeryczny" i zwróci wynik bezpośrednio jako float

Powodzenia!!

 0
Author: erick vicente,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-27 16:46:36

Jeśli nie chcesz niczego importować, zawsze możesz napisać swoją prostą funkcję jako:

def RoundUP(num): if num== int(num): return num return int(num + 1)

 0
Author: Sebin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-28 17:05:05

Możesz użyć floor devision i dodać do niego 1. 2.3 // 2 + 1

 -1
Author: user6612280,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-20 07:07:54

Myślę, że mylą Pan mechanizmy działania pomiędzy int() i round().

int() Zawsze obcina liczby dziesiętne, jeśli podana jest liczba zmienna; podczas gdy round(), w przypadku 2.5 Gdzie 2 i 3 znajdują się w równej odległości od 2.5, Python zwraca tę, która jest bardziej oddalona od punktu 0.

round(2.5) = 3
int(2.5) = 2
 -1
Author: SooBin Kim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-14 19:49:36

Jestem w zasadzie początkujący w Pythonie, ale jeśli próbujesz tylko zaokrąglić w górę zamiast w dół, dlaczego nie zrobić:

round(integer) + 1
 -3
Author: Daniel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-01 02:46:14