Moduł matematyczny Pythona zawiera przydatne funkcje, takie jak floor
& ceil
. Funkcje te przyjmują liczbę zmiennoprzecinkową i zwracają najbliższą liczbę całkowitą poniżej lub powyżej niej. Jednak te funkcje zwracają odpowiedź jako liczbę zmiennoprzecinkową. Na przykład:
import math
f=math.floor(2.3)
Teraz f
zwraca:
2.0
Jaki jest najbezpieczniejszy sposób na uzyskanie liczby całkowitej z tego elementu zmiennoprzecinkowego bez ryzyka wystąpienia błędów zaokrąglania (na przykład jeśli liczba zmiennoprzecinkowa jest równa 1,99999), a może powinienem użyć innej funkcji?
python
math
integer
python-2.x
Boaz
źródło
źródło
math.floor
zwraca liczbę zmiennoprzecinkową w v2.6 , ale zwraca liczbę całkowitą w v3 . W tym momencie (prawie sześć lat po PO) ten problem może pojawiać się rzadko.Odpowiedzi:
Wszystkie liczby całkowite, które mogą być reprezentowane przez liczby zmiennoprzecinkowe, mają dokładną reprezentację. Możesz więc bezpiecznie wykorzystać
int
wynik. Nieprecyzyjne reprezentacje występują tylko wtedy, gdy próbujesz reprezentować liczbę wymierną o mianowniku, który nie jest potęgą dwóch.To wcale nie jest trywialne! Właściwością reprezentacji zmiennoprzecinkowej IEEE jest to, że int∘floor = ⌊⋅⌋, jeśli wielkość danych liczb jest wystarczająco mała, ale możliwe są różne reprezentacje, gdzie int (floor (2.3)) może wynosić 1.
Cytat z Wikipedii :
źródło
Użycie
int(your non integer number)
go przybije.źródło
floor
zaokrągla w dół, aint
zaokrągla w kierunku 0.int(-2.3)
w dystrybucji Python Canopy 2.7.6 i dostałem-2
zgodnie z oczekiwaniami. Liczby całkowite mogą być ujemne, podobnie jak w formalnej definicji matematyki.int(-2.3)
daje,-2
jak mówisz, ponieważ zaokrągla w stronę0
, tj. W tym przypadku w górę. Natomiast użyte pierwotne pytaniemath.floor
, które zawsze zaokrągla w dół:math.floor(-2.3)
daje-3.0
.math.floor
, a ta odpowiedź pokazuje, jak przekonwertować liczbę zmiennoprzecinkową na liczbę całkowitą. Wyjmij pływakmath.floor
iint
int(math.floor(2.3))
Możesz użyć funkcji okrągłej. Jeśli nie użyjesz drugiego parametru (liczby cyfr znaczących), myślę, że uzyskasz pożądane zachowanie.
Wyjście IDLE.
źródło
round
zwraca również liczbę zmiennoprzecinkową, przynajmniej w Pythonie 2.6.round
ifloor
zwracają liczby całkowite w Pythonie 3.x. Przypuszczam więc, że pytanie dotyczy Pythona 2.x.int(round(2.65))
?round(6.5)
daje 6? Wydaje się, że jestceil()
to liczba zmiennoprzecinkowa, gdy we wszystkich innych przypadkach występuje natychmiastowa liczba 5 (lub większa do 9) po przecinku. Dlaczego to nie działa w tym przypadku? lub w każdym innym przypadku, gdy liczba kończy się cyfrą szóstą, a po przecinku jestŁącząc dwa poprzednie wyniki, mamy:
Konwertuje to liczbę zmiennoprzecinkową na liczbę całkowitą dość niezawodnie.
źródło
float
liczbę reprezentującą większą niż normalnaint
. Czy w Pythonie 2 sąfloat
wartości, które można reprezentować tylko za pomocąlong
(po zaokrągleniu)?int()
funkcja generuje alboint
albo wlong
oparciu o to, co jest potrzebne ...Ten post wyjaśnia, dlaczego działa w tym zakresie .
Podwójnie możesz bez problemu reprezentować 32-bitowe liczby całkowite. Nie może być żadnych problemów z zaokrąglaniem. Dokładniej, liczby podwójne mogą reprezentować wszystkie liczby całkowite między 2 53 a -2 53 włącznie .
Krótkie wyjaśnienie : W podwójnej pamięci można zapisać do 53 cyfr binarnych. Gdy potrzebujesz więcej, liczba jest wypełniona zerami po prawej stronie.
Wynika z tego, że 53 z nich to największa liczba, którą można przechowywać bez wypełnienia. Oczywiście wszystkie liczby (całkowite) wymagające mniejszej liczby cyfr mogą być przechowywane dokładnie.
Dodanie jednego do 111 (pominięte) 111 (53 jedynki) daje 100 ... 000, (53 zera). Jak wiemy, możemy przechowywać 53 cyfry, co sprawia, że dopełnienie zera po prawej stronie jest zerowe.
Stąd pochodzi 2 53 .
Więcej szczegółów: Musimy rozważyć, jak działa zmiennoprzecinkowy IEEE-754.
Liczbę oblicza się następnie w następujący sposób (z wyłączeniem szczególnych przypadków, które nie są tu istotne):
gdzie odchylenie = 2 wykładnik - 1 - 1 , tj. 1023 i 127 odpowiednio dla podwójnej / pojedynczej precyzji.
Wiedząc, że pomnożenie przez 2 X po prostu przesuwa wszystkie bity X miejsc w lewo, łatwo zauważyć, że każda liczba całkowita musi mieć wszystkie bity w mantysie, które kończą się po prawej stronie przecinka dziesiętnego na zero.
Każda liczba całkowita oprócz zera ma następującą postać binarną:
Ponieważ wykluczyliśmy zero, zawsze będzie MSB, który jest jeden - dlatego nie jest przechowywany. Aby zapisać liczbę całkowitą, musimy doprowadzić ją do powyższej postaci: znak -1 × 1. mantysa × 2 wykładnik - odchylenie .
To oznacza to samo, co przesunięcie bitów ponad przecinek dziesiętny, dopóki MSB nie będzie tylko po lewej stronie MSB. Wszystkie bity po prawej stronie przecinka są następnie zapisywane w mantysie.
Z tego wynika, że oprócz MSB możemy przechowywać maksymalnie 52 cyfry binarne.
Wynika z tego, że najwyższą liczbą, w której wszystkie bity są jawnie przechowywane, jest
W tym celu musimy ustawić wykładnik, tak aby przecinek dziesiętny został przesunięty o 52 miejsca. Gdybyśmy zwiększyli wykładnik o jeden, nie możemy znać cyfry od prawej do lewej po przecinku.
Zgodnie z konwencją wynosi 0. Po ustawieniu całej mantysy na zero otrzymujemy następującą liczbę:
To 1, po którym następuje 53 zera, 52 zapisane i 1 dodane ze względu na wykładnik potęgi.
Reprezentuje 2 53 , co oznacza granicę (zarówno ujemną, jak i dodatnią), pomiędzy którą możemy dokładnie przedstawić wszystkie liczby całkowite. Gdybyśmy chcieli dodać jeden do 2 53 , musielibyśmy ustawić wartość domyślną zero (oznaczoną przez
x
) na jeden, ale to niemożliwe.źródło
math.floor
zawsze zwraca liczbę całkowitą, a zatemint(math.floor(some_float))
nigdy nie wprowadza błędów zaokrąglania.Błąd zaokrąglania może już zostać wprowadzony
math.floor(some_large_float)
, a nawet w przypadku przechowywania dużej liczby w liczbach zmiennoprzecinkowych. (Duże liczby mogą stracić precyzję, gdy są przechowywane w liczbach zmiennoprzecinkowych).źródło
int
i oczywiściefloor
zwracają różne wartości liczb ujemnych.Jeśli chcesz przekonwertować zmiennoprzecinkowe zmiennoprzecinkowe na int, możesz użyć tej metody.
Przykład:
'38.0'
do38
Aby przekonwertować to na liczbę całkowitą, możesz rzucić ją jako liczbę zmiennoprzecinkową, a następnie liczbę całkowitą. Będzie to również działać w przypadku ciągów pływających lub ciągów całkowitoliczbowych.
Uwaga : Spowoduje to usunięcie wszystkich liczb po przecinku.
źródło
Kolejny przykład kodu do konwersji wartości rzeczywistej / zmiennoprzecinkowej na liczbę całkowitą przy użyciu zmiennych. „vel” to liczba rzeczywista / zmiennoprzecinkowa i konwertowana na następną najwyższą liczbę całkowitą, „newvel”.
źródło
Ponieważ pytasz o „najbezpieczniejszy” sposób, podam inną odpowiedź niż najlepsza.
Prostym sposobem, aby upewnić się, że nie stracisz żadnej precyzji, jest sprawdzenie, czy wartości byłyby równe po ich konwersji.
Jeśli liczba zmiennoprzecinkowa wynosi na przykład 1.0, 1.0 jest równe 1. Tak więc konwersja na int zostanie wykonana. A jeśli liczba zmiennoprzecinkowa wynosi 1.1, int (1.1) równa się 1, a wartość 1.1! = 1. Tak więc wartość pozostanie zmiennoprzecinkowa i nie stracisz żadnej precyzji.
źródło
df ['Column_Name'] = df ['Column_Name']. astype (int)
źródło