problemi di confronto in virgola mobile di MySQL
-
24-09-2019 - |
Domanda
mi sono imbattuto in un problema con l'introduzione di colonne in virgola mobile nello schema del database MySQL che i confronti sui valori in virgola mobile non restituiscono i risultati corretti sempre.
1-50,12
2 - 34.57
3 - 12.75
4 - ... (il resto tutti a meno di 12.00)
SELECT COUNT(*) FROM `users` WHERE `points` > "12.75"
Ciò restituisce me "3".
Ho letto che i confronti di valori in virgola mobile in MySQL è una cattiva idea e il tipo decimale è l'opzione migliore.
Devo ogni speranza di andare avanti con il tipo galleggiante e ottenere correttamente i paragoni con il lavoro?
Soluzione
Non si nota il problema di seguito?
CREATE TABLE a (num float);
INSERT INTO a VALUES (50.12);
INSERT INTO a VALUES (34.57);
INSERT INTO a VALUES (12.75);
INSERT INTO a VALUES (11.22);
INSERT INTO a VALUES (10.46);
INSERT INTO a VALUES (9.35);
INSERT INTO a VALUES (8.55);
INSERT INTO a VALUES (7.23);
INSERT INTO a VALUES (6.53);
INSERT INTO a VALUES (5.15);
INSERT INTO a VALUES (4.01);
SELECT SUM(num) FROM a;
+-----------------+
| SUM(num) |
+-----------------+
| 159.94000005722 |
+-----------------+
C'è uno spread 0.00000005722
aggiuntivo tra alcune di queste righe. Pertanto alcuni di questi valori tornerà falso se confrontato con il valore erano inizializzati con.
Per evitare problemi con aritmetica in virgola mobile e confronti, è necessario utilizzare il tipo di dati DECIMAL
:
ALTER TABLE a MODIFY num DECIMAL(6,2);
SELECT SUM(num) FROM a;
+----------+
| SUM(num) |
+----------+
| 159.94 |
+----------+
1 row in set (0.00 sec)
Altri suggerimenti
Ho fatto il volto problema simile una volta. Convertire il campo 'float' a 'decimale'. Sarà sicuramente risolvere il problema.
Lo faccio
WHERE abs(value - 12.75)<0.001
ma sono d'accordo, qualsiasi lingua può confrontare l'uguaglianza float e se i valori memorizzati è uguale a precisi valori di numeri che hai inserito, non ci dovrebbe essere alcun problema
con solo un paio di decimali e valori esatti corrispondenti, errori di precisione non suoni come una ragione evidente per tali disallineamenti di MySQL
E 'una virgola mobile, quindi qual è il problema? 3 potrebbe essere il risultato corretto, dipende da ciò che il database pensa 12.75. È 12.75 o solo un po 'di più?
Usa DECIMAL se volete numeri esatti.
C'è un problema con il confronto di galleggianti per l'uguaglianza. Questo può dare risultati imprevisti. Ciò è dovuto alla implementazione interna di floating point aritmetica.
Confronto di un numero con una stringa?
reale utilizzo, invece di FLOAT o decimale.