Pythons Mathematikmodul enthält praktische Funktionen wie floor
& ceil
. Diese Funktionen nehmen eine Gleitkommazahl und geben die nächste Ganzzahl darunter oder darüber zurück. Diese Funktionen geben die Antwort jedoch als Gleitkommazahl zurück. Beispielsweise:
import math
f=math.floor(2.3)
Jetzt f
kehrt zurück:
2.0
Was ist der sicherste Weg, um eine Ganzzahl aus diesem Float herauszuholen, ohne das Risiko von Rundungsfehlern einzugehen (z. B. wenn der Float 1,99999 entspricht), oder sollte ich eine andere Funktion verwenden?
python
math
integer
python-2.x
Boas
quelle
quelle
math.floor
Gibt in Version 2.6 einen Float zurück, in Version 3 jedoch eine Ganzzahl . Zu diesem Zeitpunkt (fast sechs Jahre nach dem OP) könnte dieses Problem selten auftreten.Antworten:
Alle Ganzzahlen, die durch Gleitkommazahlen dargestellt werden können, haben eine genaue Darstellung. So können Sie
int
das Ergebnis sicher verwenden . Ungenaue Darstellungen treten nur auf, wenn Sie versuchen, eine rationale Zahl mit einem Nenner darzustellen, der keine Zweierpotenz ist.Dass dies funktioniert, ist überhaupt nicht trivial! Es ist eine Eigenschaft der IEEE-Gleitkommadarstellung, dass int∘floor = ⌊⋅⌋ ist, wenn die Größe der fraglichen Zahlen klein genug ist, aber unterschiedliche Darstellungen möglich sind, wenn int (floor (2.3)) 1 sein könnte.
Um aus Wikipedia zu zitieren ,
quelle
Verwendung
int(your non integer number)
wird es nageln.quelle
floor
Runden ab, währendint
Runden in Richtung 0.int(-2.3)
in Python Distribution Canopy 2.7.6 getestet und-2
wie erwartet bekommen. Ganzzahlen können genauso negativ sein wie in der formalen mathematischen Definition.int(-2.3)
gibt,-2
wie Sie sagen, weil es in Richtung0
, dh in diesem Fall rundet . Im Gegensatz dazu wird die ursprüngliche Frage verwendetmath.floor
, die immer abrundet:math.floor(-2.3)
gibt-3.0
.math.floor
, und diese Antwort zeigt, wie ein Float in eine Ganzzahl umgewandelt wird. Nehmen Sie den Schwimmer ausmath.floor
undint
int(math.floor(2.3))
Sie können die Rundungsfunktion verwenden. Wenn Sie keinen zweiten Parameter (Anzahl der signifikanten Stellen) verwenden, erhalten Sie wahrscheinlich das gewünschte Verhalten.
IDLE-Ausgabe.
quelle
round
Gibt auch eine Float-Nummer zurück, zumindest in Python 2.6.round
undfloor
return Ganzzahlen in Python 3.x. Ich nehme also an, dass die Frage Python 2.x betrifft.int(round(2.65))
?round(6.5)
gibt es 6?ceil()
In allen anderen Fällen scheint es eine Art Float zu geben, wenn unmittelbar nach der Dezimalstelle eine 5 (oder höher bis 9) steht. Warum funktioniert das in diesem Fall nicht? oder in jedem anderen Fall, wenn die Zahl mit einer Sechs endet und eine 5 direkt nach der Dezimalstelle steht ...Wenn wir zwei der vorherigen Ergebnisse kombinieren, haben wir:
Dies wandelt einen Float ziemlich zuverlässig in eine Ganzzahl um.
quelle
float
Zahl, die größer ist als das, was ein Normalerint
halten kann. Gibt es in Python 2float
Werte, die Sie nur mit along
(nach dem Runden) darstellen können?int()
Funktion erzeugt entweder einint
oder einlong
basierend auf dem, was benötigt wird ...Dieser Beitrag erklärt, warum es in diesem Bereich funktioniert .
In einem Double können Sie problemlos 32-Bit-Ganzzahlen darstellen. Es kann keine Rundungsprobleme geben. Genauer gesagt können Doubles alle ganzen Zahlen zwischen und einschließlich 2 53 und -2 53 darstellen .
Kurze Erklärung : Ein Double kann bis zu 53 Binärziffern speichern. Wenn Sie mehr benötigen, wird die Zahl rechts mit Nullen aufgefüllt.
Daraus folgt, dass 53 Einsen die größte Zahl sind, die ohne Auffüllen gespeichert werden kann. Natürlich können alle (ganzzahligen) Zahlen, die weniger Ziffern erfordern, genau gespeichert werden.
Addiert man eins zu 111 (weggelassen) 111 (53 Einsen) ergibt 100 ... 000 (53 Nullen). Wie wir wissen, können wir 53 Ziffern speichern, was die Nullpunktauffüllung ganz rechts ergibt.
Hier kommt 2 53 her .
Weitere Details: Wir müssen überlegen, wie IEEE-754-Gleitkomma funktioniert.
Die Anzahl wird dann wie folgt berechnet (ausgenommen hier irrelevante Sonderfälle):
wobei Bias = 2 Exponent - 1 - 1 ist , dh 1023 und 127 für doppelte / einfache Genauigkeit.
Wenn man weiß, dass das Multiplizieren mit 2 X einfach alle Bits X nach links verschiebt, ist es leicht zu erkennen, dass jede Ganzzahl alle Bits in der Mantisse haben muss, die rechts vom Dezimalpunkt auf Null enden.
Jede Ganzzahl außer Null hat die folgende Form in Binärform:
Da wir Null ausgeschlossen haben, gibt es immer ein MSB, das Eins ist - weshalb es nicht gespeichert wird. Um die ganze Zahl zu speichern, müssen wir sie in die oben genannte Form bringen: -1 Vorzeichen × 1. Mantisse × 2 Exponent - Bias .
Das heißt, Sie verschieben die Bits über den Dezimalpunkt, bis nur noch das MSB links vom MSB angezeigt wird. Alle Bits rechts vom Dezimalpunkt werden dann in der Mantisse gespeichert.
Daraus können wir ersehen, dass wir neben dem MSB höchstens 52 Binärziffern speichern können.
Daraus folgt, dass die höchste Zahl, in der alle Bits explizit gespeichert sind, ist
Dazu müssen wir den Exponenten so einstellen, dass der Dezimalpunkt um 52 Stellen verschoben wird. Wenn wir den Exponenten um eins erhöhen, können wir die Ziffer rechts nach links nach dem Dezimalpunkt nicht kennen.
Konventionell ist es 0. Wenn Sie die gesamte Mantisse auf Null setzen, erhalten Sie die folgende Nummer:
Das ist eine 1, gefolgt von 53 Nullen, 52 gespeicherten und 1 aufgrund des Exponenten hinzugefügten.
Es stellt 2 53 dar , was die Grenze (sowohl negativ als auch positiv) markiert, zwischen der wir alle ganzen Zahlen genau darstellen können. Wenn wir eins zu 2 53 addieren wollten , müssten wir die implizite Null (bezeichnet mit
x
) auf eins setzen, aber das ist unmöglich.quelle
math.floor
gibt immer eine Ganzzahl zurück und führt daherint(math.floor(some_float))
niemals zu Rundungsfehlern.Der Rundungsfehler kann jedoch bereits in
math.floor(some_large_float)
oder sogar beim Speichern einer großen Anzahl in einem Float eingeführt werden. (Große Zahlen können an Genauigkeit verlieren, wenn sie in Schwimmern gespeichert werden.)quelle
int
undfloor
natürlich unterschiedliche Werte für negative Zahlen zurückgeben.Wenn Sie einen String float in einen int konvertieren müssen, können Sie diese Methode verwenden.
Beispiel:
'38.0'
bis38
Um dies in ein Int umzuwandeln, können Sie es als Float und dann als Int umwandeln. Dies funktioniert auch für Float-Strings oder Integer-Strings.
Hinweis : Dadurch werden alle Zahlen nach der Dezimalstelle entfernt.
quelle
Ein weiteres Codebeispiel zum Konvertieren eines Real / Float in eine Ganzzahl mithilfe von Variablen. "vel" ist eine reelle / float-Zahl und wird in den nächsthöheren INTEGER "newvel" umgewandelt.
quelle
Da Sie nach dem "sichersten" Weg fragen, werde ich eine andere Antwort als die Top-Antwort geben.
Eine einfache Möglichkeit, um sicherzustellen, dass Sie keine Genauigkeit verlieren, besteht darin, zu überprüfen, ob die Werte nach der Konvertierung gleich sind.
Wenn der float beispielsweise 1.0 ist, ist 1.0 gleich 1. Die Konvertierung in int wird also ausgeführt. Und wenn der Float 1.1 ist, entspricht int (1.1) 1 und 1.1! = 1. Der Wert bleibt also ein Float und Sie verlieren keine Genauigkeit.
quelle
df ['Column_Name'] = df ['Column_Name']. astype (int)
quelle