MySQL の float、double、および 10 進浮動小数点型の違いを要約する

coldplay.xixi
リリース: 2020-11-19 17:13:07
転載
13120 人が閲覧しました

#mysql ビデオ チュートリアルこのコラムでは、MySQL の 3 つの浮動小数点型の違いを要約しています。

MySQL の float、double、および 10 進浮動小数点型の違いを要約する

## 各浮動小数点型のストレージ サイズと範囲は、次の表で計画されています。

TypeSizeRange (符号付き) 範囲 (符号なし)目的==float==4 バイト(-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 バイト(-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)倍精度浮動小数点値10 進数 10進数(M,D)の場合、M>Dの場合はM 2、それ以外の場合はDです。 2MとDの値に依存します。 M と D の値 10 進数値

MySQL のこれら 3 つの型はすべて浮動小数点型ですが、それらの違いは何でしょうか? ?

  1. float 浮動小数点型は == 単精度浮動小数点 == 数値を表すために使用され、
  2. double 浮動小数点型は == 倍精度浮動小数点を表すために使用されますpoint == Value

<strong>ここで「単精度とは何ですか、倍精度とは何ですか?」と尋ねたい友人もいるはずです。簡単に見てみましょう!</strong>

バイト (バイト) は 8 ビットを占めることがわかりますね!

float 単精度記憶浮動小数点型の場合==4x8=32 ビット長== であるため、float 単精度浮動小数点数はメモリ内で 4 バイトを占有し、32 ビット バイナリで記述されます。

次に、倍精度浮動小数点数は、小数点記憶型は == 8x8 =64 ビット長 == であるため、倍精度浮動小数点数はメモリ内で 8 バイトを占有し、64 ビット バイナリで記述されます。計算を通じて、64 ビットはより多くの仮数を取得できます!

仮数部 : == は小数点以下の桁数です==

したがって、ここでの精度は主に == 仮数部の桁数に依存します==部分、したがって、IEEE 2 進浮動小数点数算術標準に従って、 が計算と結論に使用されます:

float の単精度小数部分は、次の 6 までの精度しかありません。桁に加えて小数点の前に 1 桁を加えます。つまり、有効桁は 7 桁です。

倍精度小数部分は、小数点以下 15 桁と小数点の前に有効な 1 桁を加えた精度になります。 、これは 16 桁です。

最後に、小数点以下の桁の長さを区別します。長いほど正確になります!

double と float の違い:

  1. メモリ占有バイト数が異なります。単精度メモリは4バイト、倍精度メモリは8バイトを占有します。
  2. 有効桁数が異なります(仮数部) 単精度小数点以下 7 桁、倍精度小数点以下有効数字 16 桁が有効です
  3. 値の範囲が異なり、IEEE 標準に従って計算されます!
  4. プログラムの処理速度が異なります一般に、CPU による単精度浮動小数点数の処理は、倍精度浮動小数点数の処理よりも高速です。

double と float の相互の長所と短所:

float 単精度

利点: float 単精度は、一部のプロセッサでは倍精度よりも高速で、必要なスペースは double 倍精度の半分のみです

欠点: ただし、値が非常に大きいか小さい場合、不正確になります。

double double precision

利点: double と float と比較して、double はより高い精度が必要であり、仮数部は 16 桁まで可能ですが、float は 7 桁しか持ちません。仮数精度

欠点: Double double 精度はメモリを消費し、float 単精度の 2 倍高速です! double の演算速度は float よりもはるかに遅くなります。double は float よりも仮数の数が多いため、計算にオーバーヘッドが発生する必要があります。 !

double と float の使用シナリオを選択する方法!

まず第一に: メモリと速度を節約するために、単精度が使用できる場合は倍精度を使用しないでください。 up 演算!

float: もちろん、小数部分が必要で、精度要件がそれほど高くない場合は、float 単精度浮動小数点型を選択することをお勧めします!

double: なぜなら小数点以下の精度が高いため、倍精度が使用されます。高速な数学計算、科学計算、衛星測位計算などでは、実際にはプロセッサ上の倍精度型の方が単精度型よりも高速です。複数回の反復で計算の精度を維持する必要がある場合、または大きな値の数値を操作する場合、このような場合には倍精度が最適な選択です。

これだけのことを言うのは、実際には小数点以下の桁数が問題です!

==double と float の概要:==

float は少ないことを表します。小数点以下の桁数: Double を使用すると、より多くの小数点以下の桁数を表現でき、より正確になります。非常に簡単です。状況に応じて自分で選択するだけです!

double と float の後ろの長さ m と d は何を表しますか?

double(m,d ) と float( m,d) ここでの m,d は何を表しますか?多くの友人もよくわかりません! 説明を続けましょう

実際、前の整数 int(n) と同様に、これらの型にも追加のパラメータがあります: 表示幅 m と d の数を持つ小数点

例: float(7,3) ステートメントは、表示される値が 7 桁を超えないことを規定しています。同様に、小数点以下 3 桁と double

MySQL の定義時にも当てはまります。テーブル フィールドの unsigned 修飾子と zerofill 修飾子は、float、double、および 10 進数のデータ型でも使用でき、その効果は int データ型と同じです。上記と同じなので、ここでは詳しく説明しません。

== 概要:==

MySQL ステートメントで実際にテーブル フィールドを定義するとき、

float(M,D) unsigned の M はフィールドの数を表します。使用できる桁数。D は小数点を表します。後の小数点以下の桁数。符号なしは、負の数値が許可されないことを意味します。

double(M,D) 符号なしの M は、小数点以下の桁数を表します。 D は小数点以下の桁数を表します

==Note:== M>=D!

小数タイプ

==1.同じストレージに 10 進数==

を導入する 範囲値は通常、10 進数よりも使用するスペースが少なくなります。Float はストレージに 4 バイトを使用し、double は 8 バイトを使用します。

そして、10 進数は M と D の値に依存するため、10 進数の方が使用するスペースが少なくなります。

実際のエンタープライズレベルの開発では、金額 (3888.00 元) を格納する必要があるフィールドがよくありますが、このとき、データ型は 10 進数を使用する必要があります。 MySQL データベースでは、10 進数を使用するための構文は次のとおりです。 10 進数(M,D)、ここで、 M の範囲は 165 です。 D の範囲は 030 です。 また、D は M より大きくすることはできません。

==2. 最大値==

データ型が 10 進数のフィールドに格納できる最大値/範囲は何ですか? 例: 10 進数(5,2)、このフィールドには -999.99 ~ 999.99 を格納でき、最大値は 999.99 です。 つまり、Dは小数部の長さを表し、(M-D)は整数部の長さを表します。

==3.ストレージ== [理解] 10 進数型のデータ格納形式は、9 桁の 10 進数を 4 バイトとして格納します

(公式説明: DECIMAL 列の値は、10 進数 9 桁を 4 バイトに詰め込むバイナリ形式を使用して格納されます) )。

設定された桁数が 9 の倍数ではない可能性があります。公式は、比較のために次の表も提供しました:

##001–21 3–425–637–94
残りの桁 バイト数
==テーブルは何を意味しますか? 例: ==

1. フィールド 10 進数 (18,9)、18-9=9 なので、整数部と小数部は両方とも 9 で、両辺はそれぞれ 4 バイトを占めます。 2. フィールド 10 進数 (20,6)、20-6=14、小数部は 6、上の表の 3 バイトに対応、整数部は 14、14-9=5、つまり 4 バイトテーブル内の 3 バイトに加えて

したがって、通常、小数を設定するときは、常に 10 進数タイプを使用します!!


Small case 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)复制代码
ログイン後にコピー

small case 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)复制代码
ログイン後にコピー

関連する無料学習の推奨事項: mysql ビデオ チュートリアル##

以上がMySQL の float、double、および 10 進浮動小数点型の違いを要約するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:juejin.im
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート