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.
Float ist kein präziser Typ. Daher sollten Sie cb auf 66,45 abschneiden, bevor Sie die Abfrage ausführen. – Guinner
Haben Sie versucht, 'cb' ohne Typumwandlung zu floaten, d. H. Verwenden Sie es als Zeichenfolge? –
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