Wie man prüft, ob eine Fließkommazahl in Python keinen Nachkommanteil hat

PythonPythonBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab lernen Sie, wie Sie in Python prüfen können, ob eine Fließkommazahl (float) keine Nachkommastellen hat, und wie Sie die Herausforderungen angehen, die durch die Darstellung von Fließkommazahlen entstehen. Das Lab beginnt mit der Untersuchung der inhärenten Ungenauigkeit von Fließkommazahlen und ihrer Auswirkungen auf direkte Vergleiche. Sie erstellen ein Python-Skript, um zu beobachten, wie scheinbar einfache Berechnungen wie 0.1 + 0.2 zu Werten führen können, die geringfügig von den erwarteten Werten abweichen, was zu unerwarteten Vergleichsergebnissen führt.

Anschließend führt das Lab Sie durch zwei Methoden zur Bestimmung, ob eine Fließkommazahl effektiv eine Ganzzahl darstellt: die Verwendung der Methode is_integer() und der Vergleich der Fließkommazahl mit ihrer Konvertierung in eine Ganzzahl. Diese Techniken bieten praktische Lösungen für die genaue Identifizierung von Fließkommazahlen ohne Nachkommastellen, trotz der zugrunde liegenden Darstellungseinschränkungen.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/BasicConceptsGroup(["Basic Concepts"]) python(("Python")) -.-> python/ControlFlowGroup(["Control Flow"]) python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python/BasicConceptsGroup -.-> python/numeric_types("Numeric Types") python/BasicConceptsGroup -.-> python/type_conversion("Type Conversion") python/ControlFlowGroup -.-> python/conditional_statements("Conditional Statements") python/FunctionsGroup -.-> python/build_in_functions("Build-in Functions") subgraph Lab Skills python/numeric_types -.-> lab-559515{{"Wie man prüft, ob eine Fließkommazahl in Python keinen Nachkommanteil hat"}} python/type_conversion -.-> lab-559515{{"Wie man prüft, ob eine Fließkommazahl in Python keinen Nachkommanteil hat"}} python/conditional_statements -.-> lab-559515{{"Wie man prüft, ob eine Fließkommazahl in Python keinen Nachkommanteil hat"}} python/build_in_functions -.-> lab-559515{{"Wie man prüft, ob eine Fließkommazahl in Python keinen Nachkommanteil hat"}} end

Untersuchung der Fließkommadarstellung

In diesem Schritt werden Sie untersuchen, wie Fließkommazahlen in Python dargestellt werden und welche potenziellen Auswirkungen diese Darstellung auf numerische Vergleiche haben kann. Fließkommazahlen werden verwendet, um reelle Zahlen (Zahlen mit Dezimalpunkten) in Computern darzustellen. Aufgrund der Art und Weise, wie sie im Speicher gespeichert werden, sind sie jedoch oft nur Näherungen der tatsächlichen reellen Zahlen. Dies kann zu unerwarteten Ergebnissen bei Vergleichen führen.

Beginnen wir damit, eine Python-Datei namens float_representation.py in Ihrem ~/project-Verzeichnis mit dem VS Code-Editor zu erstellen.

## Create a floating-point number
x = 0.1 + 0.2

## Print the value of x
print(x)

Speichern Sie die Datei und führen Sie sie dann mit dem folgenden Befehl im Terminal aus:

python float_representation.py

Sie erwarten vielleicht, dass die Ausgabe 0.3 ist, aber Sie werden wahrscheinlich etwas wie Folgendes sehen:

0.30000000000000004

Dies liegt daran, dass 0.1 und 0.2 nicht exakt als Fließkommazahlen dargestellt werden können. Das Ergebnis der Addition ist eine Zahl, die sehr nahe an 0.3 liegt, aber nicht genau gleich ist.

Jetzt sehen wir uns an, wie diese Ungenauigkeit Vergleiche beeinflussen kann. Fügen Sie den folgenden Code Ihrer float_representation.py-Datei hinzu:

## Create a floating-point number
x = 0.1 + 0.2

## Check if x is equal to 0.3
if x == 0.3:
    print("x is equal to 0.3")
else:
    print("x is not equal to 0.3")

Speichern Sie die Datei und führen Sie sie erneut aus:

python float_representation.py

Sie werden wahrscheinlich die folgende Ausgabe sehen:

x is not equal to 0.3

Dies liegt daran, dass x aufgrund des Problems mit der Fließkommadarstellung nicht genau gleich 0.3 ist.

Um Fließkommazahlen genau zu vergleichen, sollten Sie einen Toleranzwert verwenden. Anstatt auf exakte Gleichheit zu prüfen, prüfen Sie, ob die absolute Differenz zwischen den beiden Zahlen kleiner als ein kleiner Toleranzwert ist.

Ändern Sie Ihre float_representation.py-Datei, um eine Toleranz einzubeziehen:

## Create a floating-point number
x = 0.1 + 0.2

## Define a tolerance value
tolerance = 1e-9  ## A small value like 0.000000001

## Check if x is approximately equal to 0.3
if abs(x - 0.3) < tolerance:
    print("x is approximately equal to 0.3")
else:
    print("x is not approximately equal to 0.3")

Speichern Sie die Datei und führen Sie sie noch einmal aus:

python float_representation.py

Jetzt sollten Sie die folgende Ausgabe sehen:

x is approximately equal to 0.3

Durch die Verwendung einer Toleranz können Sie Fließkommazahlen trotz der inhärenten Ungenauigkeit in ihrer Darstellung genau vergleichen. Dies ist ein entscheidendes Konzept, das Sie verstehen müssen, wenn Sie mit Fließkommazahlen in Python und anderen Programmiersprachen arbeiten.

Verwendung der is_integer()-Methode

In diesem Schritt lernen Sie, wie Sie die is_integer()-Methode verwenden, um zu prüfen, ob eine Fließkommazahl (float) einen ganzzahligen Wert darstellt. Die is_integer()-Methode ist eine integrierte Methode für Float-Objekte in Python, die True zurückgibt, wenn die Fließkommazahl einen ganzzahligen Wert hat (d. h., der Nachkommanteil ist Null), und False sonst.

Erstellen wir eine neue Python-Datei namens is_integer_example.py in Ihrem ~/project-Verzeichnis mit dem VS Code-Editor.

## Example 1: Integer value
x = 5.0
print(x.is_integer())

## Example 2: Non-integer value
y = 3.14
print(y.is_integer())

## Example 3: Another integer value
z = -2.0
print(z.is_integer())

Speichern Sie die Datei und führen Sie sie mit dem folgenden Befehl im Terminal aus:

python is_integer_example.py

Sie sollten die folgende Ausgabe sehen:

True
False
True

Wie Sie sehen können, gibt is_integer() für 5.0 und -2.0 True zurück, weil sie ganzzahlige Werte darstellen, und für 3.14 False, weil es einen Nachkommanteil hat.

Betrachten wir nun das Problem der Fließkommadarstellung, das wir im vorherigen Schritt besprochen haben. Manchmal kann eine Zahl, die eigentlich eine Ganzzahl sein sollte, aufgrund der Ungenauigkeit der Fließkommadarstellung nicht exakt dargestellt werden.

Ändern Sie Ihre is_integer_example.py-Datei, um den folgenden Code einzubeziehen:

## Example 4: Floating-point imprecision
a = 0.1 + 0.2
print(a)
print(a.is_integer())

Speichern Sie die Datei und führen Sie sie erneut aus:

python is_integer_example.py

Sie werden wahrscheinlich die folgende Ausgabe sehen:

0.30000000000000004
False

Obwohl 0.1 + 0.2 mathematisch gleich 0.3 ist, macht die Fließkommadarstellung es geringfügig unterschiedlich, sodass is_integer() False zurückgibt.

Um solche Fälle zu behandeln, können Sie is_integer() mit einer Toleranzprüfung kombinieren, wie wir es im vorherigen Schritt gelernt haben. In diesem Fall prüfen wir jedoch, ob eine Zahl eine Ganzzahl darstellt, nicht ob sie gleich einem bestimmten Wert ist.

Zusammenfassend ist die is_integer()-Methode ein nützliches Werkzeug, um zu bestimmen, ob eine Fließkommazahl einen ganzzahligen Wert darstellt. Beachten Sie jedoch die potenzielle Auswirkung der Fließkommaungenauigkeit und berücksichtigen Sie deren Implikationen, wenn Sie diese Methode verwenden.

Vergleich mit int()-Konvertierung

In diesem Schritt werden Sie eine weitere Methode untersuchen, um zu prüfen, ob eine Fließkommazahl einen ganzzahligen Wert darstellt: indem Sie sie mit ihrer Ganzzahlkonvertierung mithilfe der int()-Funktion vergleichen. Die int()-Funktion entfernt den Nachkommanteil einer Fließkommazahl und wandelt sie effektiv in die nächstgelegene Ganzzahl in Richtung Null um.

Erstellen Sie eine neue Python-Datei namens int_conversion.py in Ihrem ~/project-Verzeichnis mit dem VS Code-Editor.

## Example 1: Integer value
x = 5.0
if x == int(x):
    print("x is an integer")
else:
    print("x is not an integer")

## Example 2: Non-integer value
y = 3.14
if y == int(y):
    print("y is an integer")
else:
    print("y is not an integer")

## Example 3: Another integer value
z = -2.0
if z == int(z):
    print("z is an integer")
else:
    print("z is not an integer")

Speichern Sie die Datei und führen Sie sie mit dem folgenden Befehl im Terminal aus:

python int_conversion.py

Sie sollten die folgende Ausgabe sehen:

x is an integer
y is not an integer
z is an integer

Dieser Ansatz funktioniert, weil, wenn eine Fließkommazahl bereits eine Ganzzahl darstellt, ihre Konvertierung in eine Ganzzahl mit int() ihren Wert nicht ändert. Wenn die Fließkommazahl einen Nachkommanteil hat, wird die int()-Funktion diesen entfernen, was zu einem anderen Wert führt.

Betrachten wir nun erneut das Problem der Fließkommadarstellung. Ändern Sie Ihre int_conversion.py-Datei, um den folgenden Code einzubeziehen:

## Example 4: Floating-point imprecision
a = 0.1 + 0.2
print(a)
if a == int(a):
    print("a is an integer")
else:
    print("a is not an integer")

Speichern Sie die Datei und führen Sie sie erneut aus:

python int_conversion.py

Sie werden wahrscheinlich die folgende Ausgabe sehen:

0.30000000000000004
a is not an integer

Wie im vorherigen Schritt führt die Ungenauigkeit der Fließkommadarstellung dazu, dass a geringfügig von 0.3 abweicht und daher nicht gleich seiner Ganzzahlkonvertierung (die 0 wäre) ist.

Es ist wichtig zu beachten, dass die Verwendung der int()-Konvertierung zur Prüfung der Ganzzahldarstellung weniger präzise sein kann als die Verwendung von is_integer(). is_integer() prüft, ob die Fließkommazahl eine Ganzzahl darstellt, während der Vergleich mit int() prüft, ob die Fließkommazahl gleich ihrer abgeschnittenen Ganzzahl ist.

Zusammenfassend ist der Vergleich einer Fließkommazahl mit ihrer Ganzzahlkonvertierung mithilfe von int() eine weitere Möglichkeit, zu prüfen, ob sie einen ganzzahligen Wert darstellt. Beachten Sie jedoch die potenzielle Auswirkung der Fließkommaungenauigkeit und erwägen Sie die Verwendung von is_integer() für genauere Ergebnisse.

Zusammenfassung

In diesem Lab haben Sie die Komplexitäten der Fließkommadarstellung in Python und ihre Auswirkungen auf numerische Vergleiche untersucht. Sie haben gelernt, dass Fließkommazahlen aufgrund ihrer Speicherung im Speicher oft nur Näherungen von reellen Zahlen sind, was bei direkten Gleichheitsüberprüfungen zu potenziellen Ungenauigkeiten führen kann.

Sie haben beobachtet, dass das Addieren von 0.1 und 0.2 möglicherweise nicht genau 0.3 ergibt und dass ein direkter Vergleich mit == unerwartete Ergebnisse liefern kann. Das Lab hat die Wichtigkeit hervorgehoben, diese Einschränkungen zu verstehen und alternative Vergleichsmethoden, wie die Verwendung von Toleranzwerten, einzusetzen, um die Gleichheit von Fließkommazahlen genau zu bewerten.