flotteur de problème de précision dans mysql
Quelqu'un peut-il, donné l'exemple ci-dessous, faites-moi une explication sur la façon de FLOTTEUR fonctionne dans mySQL? Je sais que le flotteur est approximative, mais vraiment, une telle différence? Et il n'est que de 9 chiffres, il n'est donc pas de problème de dépassement, n'est-ce pas?
mysql> create table t(f FLOAT(15,2), db DOUBLE);
mysql> insert into t(f,db) VALUES (512659663, 512659663);
mysql> select * from t;
+--------------+-----------+
| f | db |
+--------------+-----------+
| 512659648.00 | 512659663 |
+--------------+-----------+
(mysql Ver 14.14 Distrib 5.1.44, pour Win32 (ia32) sur Windows XP)
OriginalL'auteur ts. | 2010-12-23
Vous devez vous connecter pour publier un commentaire.
FLOAT
est un32
bits type avec, comme son nom l'indique, à virgule flottante. Plus haute est la valeur, plus faible est la précision absolue.512659648
est assez grand pour introduire des erreurs dans des dizaines.Update:
Dans
IEEE-754
(c'est ce queFLOAT
est), les données sont stockées dans32
bits:1
-bit de signe,8
-bit binaire de l'exposant et23
bits significande.L'exposant vous montre le plus proche à moins de pouvoir de
2
(28
dans votre cas, ou268435456
).Le significande est une fraction binaire. Il peut stocker des nombres de
1
à2
avec précision jusqu'à2^-23
. Dans votre cas, c'est1.11101000111010010000110
, ou~ 1.9098060
en notation décimale.Le nombre est calculé comme le produit de l'exposant et la significande.
Compte tenu de tout cela, la précision est
2 ^ (28 - 23) = 2 ^ 5 = 32
pour les numéros d'ordre (2^28
à2^29
).32 bits IEEE 754 les nombres à virgule flottante peut contenir environ 7 décimales de précision; 64 bits peut contenir environ 16 chiffres décimaux. Rien au-delà de 7 chiffres est confronté à des problèmes. Le FLOTTEUR(15,2) qualificatif est plus un vœu pieux que de vigueur; l' (15,2) est fondamentalement ignoré.
le
,2
partie sera considérée pour la moindre des valeurs, tandis que15
sera pour les plus grands.Est-ce à dire que vous ne serez pas autorisé à stocker une valeur avec une valeur absolue inférieure à 0,01 et supérieure à 0.00, ni de la valeur absolue de 10^13 ou plus? Si oui, alors le qualificatif a des dents, mais s'attendent à 15 chiffres de précision de 32 bits à virgule flottante est toujours désireux de la lune.
vous pouvez insérer des valeurs aussi petites que vous voulez, mais ils seront arrondis à l'unité la plus proche
0.01
(et puis converti enIEEE
). Les valeurs supérieures à10^14 - 1
de ne pas le faire en effet.15
chiffres ne sont pas les chiffres de précision, mais plutôt les chiffres de la représentation décimale de la plus fidèle possible.OriginalL'auteur Quassnoi
En fait, en MySQL, FLOAT et DOUBLE sont à la fois approximative des nombres à virgule flottante. MySQL utilise quatre octets pour une seule des valeurs de précision et de huit octets pour les valeurs de double précision.
Donc, les deux colonnes sont approximatives - c'est juste que votre FLOTTEUR colonne n'obtient que 4 octets pour essayer de rapprocher votre numéro.
OriginalL'auteur TehShrike
La mantisse d'un seul nombre à virgule flottante est de 22 bits de longueur. Il ne peut donc pas précisément de stocker un nombre entier plus grand que 2^22, 4194304.
OriginalL'auteur DFL