2017-08-31 4 views
0

Ich benutze Python für die Programmierung und dann Gurobi für die Lösung meiner Optimierungsprobleme. Als Teil meiner Codes lese ich die Daten aus einer Textdatei ("Feed2" genannt), mache dann einige Berechnungen darauf.Dezimal in Python

with open('Feed2.txt', 'r') as Fee: 

    for i in range(C): 
     Feed= Fee.readline() 
     for s in L11: 
      A[i,s]=float(Feed) 
     for s in L12: 
      A[i,s] =float(Feed)*1.28 
     for s in L13: 
      A[i,s] =float(Feed)*0.95 

print A 

Das Ergebnis zeigt einige der Zahlen viele Stellen nach dem Komma haben (wie 106,51209999999999 oder 1029,4144000000001), das Problem für Gurobi Kästen alle, die für das Lesen, die nicht wirklich nützlich Ziffern zu mir sind. Also, ich möchte die Anzahl der Nachkommastellen für mein gesamtes Programm auf 5 setzen, ich folgte der in https://docs.python.org/3/library/decimal.html erläuterten Methode (Codes sind unten); aber nichts ist verändert.

from decimal import * 

getcontext().prec = 5 
+1

denke ich die Einstellungen in 'decimal' nur Zahlen beeinflussen erstellt mit dieses Paket, nicht normale 'float' Zahlen. Außerdem ist dies nur ein Artefakt, wie Gleitkommazahlen im Speicher dargestellt werden. Ist das wirklich ein Problem? –

+0

Mögliches Duplikat von [Wie kann ich eine Dezimalzahl so formatieren, dass immer 2 Dezimalstellen angezeigt werden?] (Https://stackoverflow.com/questions/1995615/how-can-i-format-a-decimal-to-always-show- 2-Dezimalstellen) –

+0

Danke ,; Das Problem ist mit Gurobi beim Lesen dieser Zahlen, um das Optimierungsproblem zu lösen.Dies erhöht die Rechenzeit, die mehr als einen Tag und die Genauigkeit beträgt, was bedeutet, dass die optimale Lösung mit Null-Lücke erreicht wird. – David

Antwort

2

Die Dokumentation für die decimal module eine Erklärung bietet:

Im Gegensatz zu Hardware binären Gleitkomma-basierte, hat das Dezimalsystem Modul einen Benutzer änderbare Präzision (bis 28 Plätze in Verzug), die so groß sein kann, wie für ein gegebenes Problem benötigt.

Wenn Sie tat:

from decimal import * 
getcontext().prec = 5 

Sie nur an Präzision geändert verwendet mit Decimal Objekte aus dem Dezimalsystem Modul. Sie haben den Genauigkeitsbetrag für die integrierten Fließkommazahlen von Python nicht geändert.

Wie in den Kommentaren gesagt, ist das Verhalten, das Sie erleben, nicht neu. Es ist einfach ein Nebeneffekt der Art, wie Gleitkommazahlen im Speicher gespeichert werden. Wenn Sie die Floats wirklich benötigen, um eine bestimmte Genauigkeit zu erhalten, verwenden Sie die Klasse decimal.Decimal. zB:

>>> from decimal import Decimal 
>>> Decimal.from_float(0.1) 
Decimal('0.1000000000000000055511151231257827021181583404541015625') 
>>> Decimal('0.1') 
Decimal('0.1') 
>>> Decimal('0.1')/Decimal('0.5') 
Decimal('0.2') 

Wenn Sie müssen einfach nur die Dezimalzahl in einen spezif Präzision abzurunden korrekt angezeigt werden, verwenden Sie str.format im Format:

'{:<number of digits before decimal>.<number of digits after decimal >f}'.format(float) 

Oder mit alten Stil-Formatierung:

'%<number of digits before decimal>.<number of digits after decimal >f' % (float) 

Empfohlener Wert: 10.

0

Wenn Sie nur mit den Nummern drucken müssen, beispielsweise nur zwei Dezimalstellen:

print "%.2f" % (A,) 

oder die neueren

print "{0:.2f}".format(A)