Precisione dei numeri a virgola mobile
Per loro natura, non tutti i numeri a virgola mobile possono essere registrati con la massima precisione. L'architettura hardware, la CPU e perfino il livello di ottimizzazione e la versione del compilatore possono influenzare la precisione.
Se si comparano numeri DOUBLE o FLOAT che hanno una parte decimale, l'operatore di eguaglianza non è affidabile.
A volte, il problema si può risolvere modificando il tipo di dato da precisione singola (FLOAT) a precisione doppia (DOUBLE).
Esempi
f1, f2 e f3 apparentemente hanno lo stesso valore all'interno della stessa riga, ma a causa della precisione dei numeri a virgola mobile, il risultato potrebbe essere inaspettato.
CREATE TABLE fpn (id INT, f1 FLOAT, f2 DOUBLE, f3 DECIMAL (10,3)); INSERT INTO fpn VALUES (1,2,2,2),(2,0.1,0.1,0.1); SELECT * FROM fpn WHERE f1*f1 = f2*f2; +------+------+------+-------+ | id | f1 | f2 | f3 | +------+------+------+-------+ | 1 | 2 | 2 | 2.000 | +------+------+------+-------+
Il motivo per cui una sola delle due righe viene restituita diviene chiaro se si esamina il risultato dei quadrati dei numeri a virgola mobile.
SELECT f1*f1, f2*f2, f3*f3 FROM fpn; +----------------------+----------------------+----------+ | f1*f1 | f2*f2 | f3*f3 | +----------------------+----------------------+----------+ | 4 | 4 | 4.000000 | | 0.010000000298023226 | 0.010000000000000002 | 0.010000 | +----------------------+----------------------+----------+