2017-03-17 2 views
0

Ich analysierte einen GET-Parameter namens cb, 66,45, und ich konvertierte es in float, bekam 66,45.django fragt Daten mit falschen Ziffern

cb = request.GET.get("cb", '') 
if re.match('^\d+(\.\d+)?$', cb): 
    cb=float(cb) 
    params['cb'] = cb 

Und dann habe ich es verwendet, um db Daten abzufragen, wurde leer.

products = Product.objects.filter(**params) 

In der Tat fand ich, wenn das Debuggen, die SQL-Abfrage 66.4500000000000028421709430404007434844970703125 anstelle von 66.45, und das verursachte mein leeres Abfrageergebnis.

Die cb wird in Produktmodell wie folgt definiert:

cb = models.DecimalField(max_digits=6, decimal_places=2, default=0) 

Gibt es etwas falsch gemacht? Ich bin verwirrt.

+0

Float ist kein präziser Typ. Daher sollten Sie cb auf 66,45 abschneiden, bevor Sie die Abfrage ausführen. – Guinner

+0

Haben Sie versucht, 'cb' ohne Typumwandlung zu floaten, d. H. Verwenden Sie es als Zeichenfolge? –

+0

Es funktioniert, wenn cb als String verwendet wird, weil mysql das unterstützt. Ich habe versucht, cb in Float in Python-Interpreter zu werfen und bekam die gleiche 66.45. Warum wird es in der Django-Abfrage nicht präzise? Und ist es so gefährlich, Ziffern zu geben? – Uphie

Antwort

0

Danke für @nik_m und @Renyuan wang. Es funktioniert, wenn cb als Zeichenfolge oder cb=Decimal(cb) verwendet wird.

Ich bin immer noch verwirrt.

enter image description here

Ich denke, django wahrscheinlich dieses Problem verursacht, aber ich bin mir nicht sicher.

+0

Sie sollten 'print' nicht glauben. Ich denke, es gibt ein Standardformat für 'print' mit float. Versuchen Sie 'print ('% 3.15f'% cb)' und Sie erhalten 66.450000000000003 –

+0

Ja, Sie haben Recht. Django verwendet den genauesten Wert von cb. Casting 66, bekam 66.000 ... 000, und 66.4 bekam 66.400 ... 40625. Manchmal liefert das Casting nicht den erwarteten präzisen Wert wie 66.4 und 45.43 und liefert manchmal präzise Werte wie 66 und 45.5. Es ist erforderlich, Float Casting sorgfältig zu verwenden. – Uphie

Verwandte Themen