Maison > base de données > tutoriel mysql > le corps du texte

Résumer les différences entre les types à virgule flottante float, double et décimal dans MySQL

coldplay.xixi
Libérer: 2020-11-19 17:13:07
avant
13119 Les gens l'ont consulté

Tutoriel vidéo MySQLLa colonne résume les différences entre les trois types à virgule flottante dans MySQL

Résumer les différences entre les types à virgule flottante float, double et décimal dans MySQL

La taille et la plage de stockage de chaque type à virgule flottante sont prévues dans le tableau suivant :

类型 大小 范围(有符号) 范围(无符号) 用途
==float== 4 bytes (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度 浮点数值
==double== 8 bytes (-1.797 693 134 862 315 7 E+308,-2.225073858507 2014E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度 浮点数值
decimal 对decimal(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值

Donc, ces trois types dans MySQL sont tous des types à virgule flottante. Quelles sont les différences entre eux ? ?

  1. le type à virgule flottante float est utilisé pour représenter == virgule flottante simple précision == valeur numérique,
  2. le type à virgule flottante double est utilisé pour représenter == flottant double précision point == Value

<code><strong>这里肯定有些小伙伴要问了  什么是单精度 什么是双精度 ? 下面我们就来简单了解一下吧!</strong>Certains amis ici doivent se demander : qu'est-ce que la simple précision et qu'est-ce que la double précision ? Jetons-y un bref coup d'œil !

Nous savons qu'un octet (octet) occupe 8 bits, n'est-ce pas !

float stockage simple précision type à virgule flottante Il est ==4x8=longueur 32 bits==, donc le nombre à virgule flottante simple précision float occupe 4 octets dans la mémoire et est décrit en binaire 32 bits

Ensuite, le nombre à virgule flottante double précision le type de stockage est = =8x8 =longueur 64 bits==, donc un nombre à virgule flottante double précision occupe 8 octets en mémoire et est décrit en binaire 64 bits Grâce au calcul, 64 bits peuvent obtenir plus de mantisses !

Mantisse : == est le nombre de chiffres après la virgule décimale==

La précision ici dépend donc principalement du nombre de chiffres dans la partie ==mantissa== , Donc, selon la norme arithmétique binaire à virgule flottante de l'IEEE est utilisée pour calculer et conclure :

La partie décimale simple précision de float ne peut être précise qu'aux 6 chiffres suivants, plus un chiffre avant la virgule décimale, c'est-à-dire que le chiffre effectif est de 7 bits

double La partie décimale du double peut être précise à 15 chiffres après la virgule décimale, plus un chiffre significatif avant la virgule décimale, soit 16 chiffres.

Enfin, on distingue la longueur des chiffres après la virgule décimale. Plus c'est long, plus c'est précis !

La différence entre double et float :

  1. Le nombre d'octets occupés dans la mémoire est différent, la mémoire simple précision occupe 4 octets, la mémoire double précision occupe 8 octets
  2. Le nombre de chiffres significatifs est différent (mantisse) Simple précision est valable après la virgule décimale 7 chiffres, 16 chiffres significatifs après la virgule décimale double précision
  3. La plage de valeurs numériques est différente et calculée selon la norme IEEE !
  4. La vitesse de traitement dans le programme est D'une manière générale, le traitement par le processeur des nombres à virgule flottante simple précision est plus rapide que le traitement des nombres à virgule flottante double précision

Les avantages et les inconvénients du double et du flottement les uns sur les autres :

float单精度

Avantages : la simple précision flottante est plus rapide que la double précision sur certains processeurs et ne prend que la moitié de l'espace du double

Inconvénients : Mais lorsque la valeur est grande ou petit, il deviendra moins précis.

double双精度

Avantages : Par rapport au double, le double doit avoir une précision plus élevée. La mantisse peut avoir 16 chiffres, tandis que le float n'a que 7 chiffres de précision de mantisse.

Inconvénients : double La double précision consomme de la mémoire et est deux fois plus rapide que la simple précision float La vitesse de fonctionnement de double est beaucoup plus lente que celle de float car double a plus de mantisses que float, il doit donc y avoir une surcharge dans le calcul !

Comment choisir les scénarios d'utilisation du double et du float !

Tout d'abord : n'utilisez pas la double précision lorsque la simple précision est disponible pour économiser de la mémoire et accélérer les opérations !

float : Bien sûr Lorsque vous avez besoin de la partie décimale et que vous n'avez pas d'exigences de grande précision, il est préférable de choisir le type float simple précision à virgule flottante

double : En raison de la haute précision de la décimale ! place, la double précision est utilisée pour les calculs mathématiques et scientifiques à grande vitesse. La double précision est en fait plus rapide que la simple précision sur les processeurs tels que les calculs et les calculs de positionnement par satellite, donc : Lorsque vous devez maintenir la précision des calculs sur plusieurs itérations, ou lorsque l'on opère sur de très grands nombres, la double précision est le meilleur choix.

En dire autant dépend en fait du nombre de chiffres réservés après la virgule décimale !

==Résumé de double et float :==

float représente moins décimales, Double peut représenter plus de décimales et est plus précis ! C'est aussi simple que de choisir selon la situation !

Que représentent les longueurs m et d derrière double et float

double(m,d) et float( ? m,d) Que représente m,d ici ? Beaucoup d'amis ne sont pas clairs non plus ! Laissez-moi continuer à expliquer

En fait, comme le précédent entier int(n), ces types ont également des paramètres supplémentaires : une largeur d'affichage m et un point décimal avec le nombre d

Par exemple : L'instruction float(7,3) stipule que la valeur affichée ne dépassera pas 7 chiffres, avec 3 chiffres après la virgule décimale, et il en va de même pour double

dans MySQL , lors de la définition des champs de table, les modificateurs unsigned et zerofill peuvent également être utilisés par les types de données float, double et décimal, et l'effet est le même que le type de données int. C'est le même que ci-dessus, je n'entrerai donc pas dans les détails. ici !

= =Résumé :==

Dans l'instruction MySQL, lors de la définition réelle des champs de la table, le M dans

float(M,D) non signé représente le nombre de chiffres pouvant être utilisés, et D représente le nombre de décimales après la virgule, non signé signifie que les nombres négatifs ne sont pas autorisés !

double(M,D) Le M en non signé représente le nombre de décimales pouvant être utilisées, et D représente le nombre de décimales après la virgule décimale

==Remarque :== M>=D !

type décimal

==1. Introduire decimal==

dans le stockage Pour les valeurs dans la même plage, il utilise généralement moins d'espace que decimal Float utilise 4 octets pour stocker, double utilise 8 octets. ,

et décimal dépendent des valeurs de M et D, donc décimal utilise plus d'espace

.

Dans le développement réel au niveau de l'entreprise, nous rencontrons souvent des champs qui doivent stocker le montant (3888,00 yuans). À l'heure actuelle, nous devons utiliser le type de données décimal. Dans la base de données MySQL, la syntaxe d'utilisation de la décimale est : decimal(M,D), où, La plage de M est 165, La plage de D est 030, Et D ne peut pas être supérieur à M.

==2. Valeur maximale==

Quelle est la valeur/plage maximale pouvant être stockée dans un champ dont le type de données est décimal ? Par exemple : decimal(5,2), ce champ peut stocker -999,99~999,99 et la valeur maximale est 999,99. C'est-à-dire que D représente la longueur de la partie décimale et (M-D) représente la longueur de la partie entière.

==3.Storage== [Comprendre] La forme de stockage de données de type décimal consiste à stocker chaque nombre décimal à 9 chiffres sur 4 octets

(explication officielle : les valeurs des colonnes DECIMAL sont stockées en utilisant un format binaire qui regroupe neuf chiffres décimaux dans 4 octets) .

Il est possible que le nombre de chiffres fixé ne soit pas un multiple de 9. Le responsable a également fourni le tableau suivant à titre de comparaison :

Leftover Digits Number of Bytes
0 0
1–2 1
3–4 2
5–6 3
7–9 4

==Que signifie le tableau ? exemple : ==

1. Champ décimal(18,9), 18-9=9, donc la partie entière et la partie décimale sont toutes deux 9, et chaque côté occupe 4 octets ; 2. Champ décimal(20,6), 20-6=14, la partie décimale est 6, ce qui correspond aux 3 octets du tableau ci-dessus, et la partie entière est 14, 14-9=5, soit 4 octets Plus les 3 octets du tableau

Donc, généralement, lorsque nous définissons des décimales, nous utilisons le type décimal !!


Petit cas 1

mysql> drop table temp2;
Query OK, 0 rows affected (0.15 sec)

mysql> create table temp2(id float(10,2),id2 double(10,2),id3 decimal(10,2));
Query OK, 0 rows affected (0.18 sec)

mysql>  insert into temp2 values(1234567.21, 1234567.21,1234567.21),(9876543.21, 
    -> 9876543.12, 9876543.12);
Query OK, 2 rows affected (0.06 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from temp2;
+------------+------------+------------+
| id         | id2        | id3        |
+------------+------------+------------+
| 1234567.25 | 1234567.21 | 1234567.21 |
| 9876543.00 | 9876543.12 | 9876543.12 |
+------------+------------+------------+
2 rows in set (0.01 sec)

mysql> desc temp2;
+-------+---------------+------+-----+---------+-------+
| Field | Type          | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| id    | float(10,2)   | YES  |     | NULL    |       |
| id2   | double(10,2)  | YES  |     | NULL    |       |
| id3   | decimal(10,2) | YES  |     | NULL    |       |
+-------+---------------+------+-----+---------+-------+
3 rows in set (0.01 sec)复制代码
Copier après la connexion

Petit cas 2

mysql> drop table temp2;
Query OK, 0 rows affected (0.16 sec)

mysql> create table temp2(id double,id2 double);
Query OK, 0 rows affected (0.09 sec)

mysql> insert into temp2 values(1.235,1,235);
ERROR 1136 (21S01): Column count doesn't match value count at row 1
mysql> insert into temp2 values(1.235,1.235);
Query OK, 1 row affected (0.03 sec)

mysql> 
mysql> select * from temp2;
+-------+-------+
| id    | id2   |
+-------+-------+
| 1.235 | 1.235 |
+-------+-------+
1 row in set (0.00 sec)

mysql> insert into temp2 values(3.3,4.4);
Query OK, 1 row affected (0.09 sec)

mysql> select * from temp2;
+-------+-------+
| id    | id2   |
+-------+-------+
| 1.235 | 1.235 |
|   3.3 |   4.4 |
+-------+-------+
2 rows in set (0.00 sec)

mysql> select id-id2 from temp2;
+---------------------+
| id-id2              |
+---------------------+
|                   0 |
| -1.1000000000000005 |
+---------------------+
2 rows in set (0.00 sec)

mysql> alter table temp2 modify id decimal(10,5);
Query OK, 2 rows affected (0.28 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> alter table temp2 modify id2 decimal(10,5);
Query OK, 2 rows affected (0.15 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from temp2;
+---------+---------+
| id      | id2     |
+---------+---------+
| 1.23500 | 1.23500 |
| 3.30000 | 4.40000 |
+---------+---------+
2 rows in set (0.00 sec)

mysql> select id-id2 from temp2;
+----------+
| id-id2   |
+----------+
|  0.00000 |
| -1.10000 |
+----------+
2 rows in set (0.00 sec)复制代码
Copier après la connexion

Recommandations d'apprentissage gratuites associées : tutoriel vidéo MySQL

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:juejin.im
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal