/ / Python: Warum werden Dezimalzahlen approximiert? - Python-3.4

Python: Warum werden Dezimalzahlen approximiert? - Python-3.4

Ich experimentierte mit der IDLE Python 3.4.0-Shell und führte den folgenden Code aus.

>>> from decimal import *
>>> getcontext().prec = 500
>>> e = Decimal(2.4)
>>> print(e)
2.399999999999999911182158029987476766109466552734375

Wie Sie sehen, setze ich die Variable e genau 2,4, nicht mehr und nicht weniger. Wenn ich jedoch drucke estatt zu drucken 2.4 oder 2.400000..., es wurde gedruckt, was Sie oben sehen. Ich habe dann versucht das zu ändern getcontext().prec bis 5, und es wurden immer noch dieselben Ergebnisse gedruckt. Um mein Experiment zu wiederholen, habe ich es mit einer ganzen Zahl und einer weiteren Dezimalzahl getestet.

>>> f = Decimal(10)
>>> print(f)
10
>>> g = Decimal(10.1)
>>> print(g)
10.0999999999999996447286321199499070644378662109375

Die seltsame Folge von Dezimalzahlen wird nur gedruckt, wenn ich der Dezimalklasse eine nicht ganze Zahl zuweise. Zum Schluss habe ich das mit Fließkommazahlen getestet.

>>> h = float(2.4)
>>> print(h)
2.4
>>> i = float(10.1)
>>> print(i)
10.1

Warum verursacht die Dezimalklasse diese ungeraden Dezimalstellen anstelle der genauen Anzahl?

Antworten:

1 für die Antwort № 1

Dies hat nichts mit Python zu tun, es ist genau so, wie Computer Gleitkomma-Arithmetik verwenden.

Tun Sie so, als würden Sie 1/3 genau aufschreibenals Dezimalstelle in der Basis 10 - Sie können "t as you don" nicht unendlich viel Zeit oder Papier haben. (0.333333 ...) Es gibt unendlich viele 3s, daher kann jede Dezimaldarstellung immer nur eine Annäherung sein.

In ähnlicher Weise können Computer einige nicht darstellenFraktionen mit perfekter Präzision. (Da sie keinen unendlichen Speicher haben) In diesem Fall ist der nächstliegende Computer 10.1 getcontext() oder irgendetwas anderes, weil der Computer 10.1 oder 2.4 nicht vollständig speichern kann.


2 für die Antwort № 2

Wenn Sie das Literal übergeben 2.4 zu Dezimal, erstellen Sie ein Decimal aus dem float 2.4. Der Wert des Float ist bereits angenähert und es gibt keine Möglichkeit dafür Decimal um diese "Genauigkeit" zurückzubekommen.

Um die Dezimalzahl (2.4) genau zu erstellen, können Sie stattdessen eine Zeichenfolge übergeben

>>> from decimal import *
>>> getcontext().prec = 500
>>> e = Decimal("2.4")
>>> e
Decimal("2.4")

oder verwenden Sie Division für eine Dezimalzahl, die von einer Ganzzahl abgeleitet ist

>>> Decimal(24)/10
Decimal("2.4")