Die aufrufbare Klasse ›Decimal‹ in Python
Das aufrufbare Objekt ›Decimal‹ wandelt den Argumentwert in den Typ »Decimal«. Der Wert eines Aufrufs dieses Objekts hat stets die Klasse »Decimal« als Typ.
Dieser Typ verwendet eine dezimale Darstellung für seine Werte, die auch Nachkommastellen umfassen können, und erlaubt eine hohe Rechengenauigkeit.
Die Python -Implementation erweckt normalerweise den Eindruck als könne sie den Wert „0,1“ (ein Zehntel) intern genau darstellen.
- Protokoll
0.1
0.1
Da jener Wert für einen Menschen relativ gut beherrschbar ist, besteht kein Grund daran zu zweifeln, daß auch eine Python -Implementation mit ihm umgehen kann. Tatsächlich speichert die Python -Implementation jenen Wert zur Beschleunigung der Verarbeitung normalerweise im Dualsystem mit einer beschränkten Anzahl von Bits; dabei kann er dann jedoch nur näherungsweise dargestellt werden. Durch kleine Rundungen bei der Ausgabe wird der Wert dann wieder mit dem Text »0.1« dargestellt, so daß die kleine Ungenauigkeit nicht bemerkt wird.
Bei einer Wandlung in den Typ »Decimal« wird jedoch der Wert erkennbar, der tatsächlich zu internen Darstellung des Wertes des Numerales »0.1« verwendet wird.
- Protokoll
from decimal import Decimal
Decimal( 0.1 )
Decimal('0.1000000000000000055511151231257827021181583404541015625')
Für die Ausgabe der Werte des Typs »Decimal« wird ein Verfahren verwendet, das den Wert ganz genau im Zehnersystem darstellt. Dadurch wird es sichtbar, daß der Wert von »0.1« nicht genau ein Zehntel ist.
- Auswertung
type( Decimal( 0.1 ))
<class 'decimal.Decimal'>
Um einen Wert zu erhalten, der genau ein Zehntel ist, muß »0.1« als Zeichenfolge angegeben werden.
- Auswertung
print( Decimal( '0.1' ))
0.1
float-Rechnungen zeigen manchmal Abweichungen von den Ergebnissen, die eine manuelle Berechnung ergibt.
- Auswertung
0.1 + 0.2
0.30000000000000004
- Auswertung
0.1 + 0.2 - 0.3
5.551115123125783e-17
Die Ergebnisse von Decimal-Rechnungen liefern in der Regel Ergebnisse, die auch eine manuelle Berechnung ergeben würde.
- Protokoll
print( Decimal( '0.1' )+ Decimal( '0.2' ))
0.3
- Auswertung
print( Decimal( '0.1' )+ Decimal( '0.2' )- Decimal( '0.3' ))
0.0
Ein Decimal-Wert kann mit dem Objekt »(float)« in einen float-Wert gewandelt werden.
- Auswertung
float( Decimal( '0.1' )+ Decimal( '0.2' )- Decimal( '0.3' ))
0.0
Die Genauigkeit des Datentyps »Decimal« geht noch über die von »float« hinaus.
- Auswertung
1/7
0.14285714285714285
- Auswertung
print( Decimal( '1' )/ Decimal( '7' ))
0.1428571428571428571428571429
Die Genauigkeit von Rechnungen mit Werten des Datentyps »Decimal« kann vom Programmierer noch im Detail festgelegt werden. Die Details sollen aber an dieser Stelle des Kurses nicht behandelt werden.
Die Darstellung von Decimal-Werten
Um einen Decimal-Wert so darzustellen, daß die Auswertung der Darstellung wieder einen dem ursprünglichen Decimal-Wert gleichwertigen Wert ergibt, verwendet ›repr‹ eine Schreibweise mit dem Namen »Decimal« als Prälaten.
- Protokoll
from decimal import Decimal
print( str( Decimal( '0.1' )))
0.1
- Protokoll
from decimal import Decimal
print( repr( Decimal( '0.1' )))
Decimal('0.1')