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 ? ?
<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 !
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 :
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 !!
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)复制代码
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)复制代码
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!