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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top