2016-05-06 11 views
1

Ich speichere den Preis als Dezimal (8,2) in Mysql und ich muss die Gleichheit mit einem Float in Python vergleichen.Wie vergleicht man eine Python-Float mit einer Mysql-Dezimalstelle in Python?

Angenommen, ich habe 4.28 in der Datenbank und select gibt price = (Decimal(4.28),) zurück. Ich konvertiere es in Python-Dezimal von decimal.Decimal(price[0]), aber decimal.Decimal(price[0]) == 4.28 gibt false zurück.

Gibt es eine Möglichkeit Gleichheit direkt andere zu vergleichen, als die Differenz mit einer kleinen Zahl zu vergleichen, dh decimal.Decimal(price[0]) - decimal.Decimal(4.28) < 0.01

Dank

+0

'Preis [0]' ist bereits dezimal. Warum versuchen Sie, es wieder in Dezimal umzuwandeln, wie 'dezimal.Dezimal (Preis [0])'? Weil 'decimal.Decimal (decimal.Decimal (4.28))' Decimal ('4.28000000000000024868995751603506505489349365234375') in meinem Laptop zurückgegeben hat. – ozgur

+0

@ozgur 'Preis [0]' ist eine Rückgabewert aus der Datenbank (mit mysqldb), die nicht Python ist dezimal, es buchstäblich 'Dezimal (4.28)' – Harrison

Antwort

3

Nein, es gibt keinen anderen Weg für die Gleichstellung schweben Darstellungen von Zahlen zu vergleichen, aber es gibt Möglichkeiten, um es praktikabel zu machen:

decimal.Decimal(price[0]) - decimal.Decimal(4.28) < 0.01 

wirklich sein sollte:

abs(decimal.Decimal(price[0]) - decimal.Decimal(4.28)) < 0.01 

Sie abstrahieren kann der Vergleich:

def almost_equal(a, b, epsilon=1e-5): 
    """returns true is the absolute value of the difference between a & b 
    is less than epsilon i/e a & b are almost equal, False otherwise 
    """ 
    return abs(a - b) < epsilon 
+0

gute Wahl für die 'abs()' Teil. Ich werde es nur einmal benutzen, also wahrscheinlich keine Notwendigkeit, eine Methode dafür zu machen. – Harrison

1

Sie müssen konvertieren, was Sie in eine Dezimalzahl zu Vergleich:

decimal.Decimal('4.28') == decimal.Decimal(price[0])