2009-05-22 7 views
4

Nous utilisons MySQL 5.0 sur Ubuntu 9.04. La version complète est: 5.0.75-0ubuntu10MySql FLOAT type de données et les problèmes avec plus de l'échelle de 7 chiffres

J'ai créé une base de données de test. et une table de test dedans. Je vois la sortie suivante d'une instruction d'insertion:

mysql> CREATE TABLE test (floaty FLOAT(8,2)) engine=InnoDb; 
Query OK, 0 rows affected (0.02 sec) 

mysql> insert into test value(858147.11); 
Query OK, 1 row affected (0.01 sec) 

mysql> SELECT * FROM test; 
+-----------+ 
| floaty | 
+-----------+ 
| 858147.12 | 
+-----------+ 
1 row in set (0.00 sec) 

Il semble y avoir un problème avec l'échelle/précision créée en MySql ... ou ne me manque quoi que ce soit?

MISE À JOUR:

trouvé une limite pour l'un des chiffres que nous avons l'insertion, voici le code:

mysql> CREATE TABLE test (floaty FLOAT(8,2)) engine=InnoDb; 
Query OK, 0 rows affected (0.03 sec) 

mysql> insert into test value(131071.01); 
Query OK, 1 row affected (0.01 sec) 

mysql> insert into test value(131072.01); 
Query OK, 1 row affected (0.00 sec) 

mysql> SELECT * FROM test; 
+-----------+ 
| floaty | 
+-----------+ 
| 131071.01 | 
| 131072.02 | 
+-----------+ 
2 rows in set (0.00 sec) 

mysql> 
+0

Je reçois effectivement 858147.13 sur ma boîte de windows exécutant MySQL 5.0.67. – itsmatt

Répondre

9

Visage Palm !!!!

Les flottants sont des nombres de 32 bits stockés en tant que mantisse et exposants. Je ne suis pas sûr à 100% de la façon dont MySql divisera le stockage, mais prenant Java comme exemple, ils utiliseraient 24 bits pour une mantisse signée et 8 bits pour un exposant (notation scientifique). Cela signifie que la valeur maximale d'un FLOAT peut être + 8388608 * 10^127 et le minimum est de -8388608 * 10^127. Cela signifie seulement 7 chiffres significatifs, et ma définition FLOAT utilisé 8.

Nous allons passer tous ces 8,2 à DOUBLE de FLOAT.

1

docs MySQL mention « MySQL effectue l'arrondissement lors de l'enregistrement des valeurs » et je suspecte que ce soit le problème ici. Je dupliqué votre problème, mais changé le type de stockage à DOUBLE:

CREATE TABLE test (val, DOUBLE); 

et la valeur récupérée correspondait à la valeur de test que vous avez fourni.

Ma suggestion, pour ce que ça vaut, est d'utiliser DOUBLE ou peut-être DECIMAL. J'ai essayé le même test original avec:

CREATE TABLE test (val, DECIMAL(8,2)); 

et récupéré la valeur que je lui ai donné: 858147,11.

Questions connexes