2017-12-29 18 views
0

Ich habe Probleme mit der Funktion round() in Python. Wenn ich eine Zahl auf eine Anzahl von Dezimalstellen aufrichte (mit der Absicht, nachgestellte Nullen herauszunehmen), wird die Ausgabe normalerweise in wissenschaftlicher Notation angegeben. Beispiel:Python - Round Funktion, die unerwünschte wissenschaftliche Notation anzeigt

round (75435000000,00, -6) = 7.5435E + 10

ich die Ausgabe in normaler Schreibweise haben muß, das heißt 75435000000. Ich bin die dezimale Modul für den Dezimal-Datentyp für die Verwendung von Nummern involviert, und in diesem Modul ist die .normalize() -Methode, die nachgestellte Nullen herausnimmt und wissenschaftliche Notation in normale Notation umwandelt, aber ich kann es nicht zum Laufen bringen.

Vielen Dank für jede Hilfe, Harry

+1

Nur einen Kommentar ... welche Version von Python werden Sie verwenden? und welches OS? Unter Linux und dem Versuch, sowohl Python 2.7 als auch Python 3.6 zu verwenden, erhalte ich immer den Wert ohne wissenschaftliche Notation. '>>> Runde (75435000000,00, -6) 75435000000,0 ' – gunzapper

+0

Hinweis: In Python 3.6 '>>> round (75435000000,00) 75435000000', denn als doc-String sagt ohne das optionale Argument Runde einen int zurückgibt. – gunzapper

+1

Die 'runde' Funktion ** zeigt nichts an **. Sie müssen uns sagen, was Sie * verwenden, um das Ergebnis anzuzeigen. –

Antwort

0

Python decimal.Decimal Zahlen haben ein Vorzeichen, Ziffern und Exponenten. Eine gegebene Dezimalzahl kann in mehr als einer Weise geschrieben werden, z. 1230E0 oder 123E1, und diese haben (während sie gleich sind) unterschiedliche Darstellungen im Modul decimal.

Dies ist absichtlich; der semantische Unterschied ist die Signifikanz. (Wie in genau 100.00 bis zwei Plätze nach dem Punkt gegen 100 Baseballstadion).

Das gleiche gilt für die Zahlen in Ihrem Beispiel vor und nach dem Rundungsvorgang. Durch das Runden entziehst du die Signifikanz. decimal wechselt in die wissenschaftliche Notation, da nur so nachgestellte Nullen angezeigt werden, die keine Signifikanz bedeuten.

x = decimal.Decimal('75435000000.00') 
x 
# Decimal('75435000000.00') 
y = round(x, -6) 
y 
# Decimal('7.5435E+10') 

Der Unterschied in Darstellungen und zwischen xy kann mit as_tuple gesehen werden:

x.as_tuple() 
# DecimalTuple(sign=0, digits=(7, 5, 4, 3, 5, 0, 0, 0, 0, 0, 0, 0, 0), exponent=-2) 
y.as_tuple() 
# DecimalTuple(sign=0, digits=(7, 5, 4, 3, 5), exponent=6) 

y die keine nacheilenden Nullen aufweist, wird der normalisierte Darstellung betrachtet.

x.normalize() 
# Decimal('7.5435E+10') 

Aber quantize können Sie zurück zu Ihrem bevorzugten Form erhalten.

z = y.quantize(0) 
z 
# Decimal('75435000000') 

Oder, wenn Sie zwei Stellen nach dem Punkt müssen:

y.quantize(decimal.Decimal('0.00')) 
# Decimal('75435000000.00') 
0

eine rohe Zahl Rundungs ​​funktioniert so, wie Sie es wollen, so können Sie dies tun:

def round_decimal(n, places): 
    return Decimal(round(float(n), places)) 

es mit einem Schwimmer konvertieren, rund, dann zurück zu dezimal.

Verwandte Themen