MySQL:floatとdoubleの違いは何ですか?


110

新しいデータベース構造をチェックインすると、誰かがフィールドをfloatからdoubleに変更したことがわかりました。どうしてかと思って、mysqlのドキュメントをチェックしましたが、正直に違いが何であるか理解できませんでした。

誰かが説明できますか?



1
:私はあなたがこのリンク意味を推測dev.mysql.com/doc/refman/5.0/en/problems-with-float.html
アルン

これは、より役に立つかもしれません:stackoverflow.com/questions/5150274/...
Iftiマフムード

また、関連:ポイント#5のdev.mysql.com/doc/refman/5.0/en/no-matching-rows.html
rinogo

回答:


106

どちらも浮動小数点数を表します。A FLOATは単精度用、a DOUBLEは倍精度数用です。

MySQLは、単精度値に4バイト、倍精度値に8バイトを使用します。

DECIMALデータ型で使用できる浮動小数点数や10進数(数値)とは大きな違いがあります。これは、浮動小数点数とは異なり、正確な数値データ値を格納するために使用されます。浮動小数点数では、正確な精度を維持することが重要です(たとえば、通貨データなど)。


27
例で詳しく説明できますか
Kailas 2014

4
@Kailas Floatは丸められ、小数は丸められません。Decimal(9,3)は、たとえば123456.789のようになりますが、123456.789を格納しようとすると、浮動小数点数として123456.0として挿入されます。
ブレイク

76

おそらくこの例で説明できるでしょう。

CREATE TABLE `test`(`fla` FLOAT,`flb` FLOAT,`dba` DOUBLE(10,2),`dbb` DOUBLE(10,2)); 

次のようなテーブルがあります。

+-------+-------------+
| Field | Type        |
+-------+-------------+
| fla   | float       |
| flb   | float       |
| dba   | double(10,2)|
| dbb   | double(10,2)|
+-------+-------------+

最初の違いとして、各フィールドに「1.2」のレコードを挿入しようとします。

INSERT INTO `test` values (1.2,1.2,1.2,1.2);

次のような表が表示されます。

SELECT * FROM `test`;

+------+------+------+------+
| fla  | flb  | dba  | dbb  |
+------+------+------+------+
|  1.2 |  1.2 | 1.20 | 1.20 |
+------+------+------+------+

違いを見ます?

次の例を試してみます:

SELECT fla+flb, dba+dbb FROM `test`;

ほら!このような違いを見つけることができます:

+--------------------+---------+
| fla+flb            | dba+dbb |
+--------------------+---------+
| 2.4000000953674316 |    2.40 |
+--------------------+---------+

1
たぶん、より良い比較は、flaとflbに小数点を2つ与えることでした。float(10, 2)
2017年

30

doubleは、floatと同じですが、2倍の大きさである点が異なります。これにより、精度が向上します。


あるポイントの後でフロートとダブルが丸くなることに注意してください。たとえば、100000.1は浮動小数点数として100000に切り捨てられます。
Blake

14

別のを1.3追加または乗算するときに値を使用して違いを確認するのに役立つ独自の例を追加すると思いますがfloatdecimalなどをdouble

1.3フロート1.3は、さまざまなタイプに追加されました:

|float              | double | decimal |
+-------------------+------------+-----+
|2.5999999046325684 | 2.6    | 2.60000 |

1.31.3異なるタイプの浮動小数点数:

| float              | double             | decimal      |
+--------------------+--------------------+--------------+
| 1.6899998760223411 | 1.6900000000000002 | 1.6900000000 |

これはMySQL 6.7を使用しています

クエリ:

SELECT 
    float_1 + float_2 as 'float add',
    double_1 + double_2 as 'double add',
    decimal_1 + decimal_2 as 'decimal add',

    float_1 * float_2 as 'float multiply',
    double_1 * double_2 as 'double multiply',
    decimal_1 * decimal_2 as 'decimal multiply'
FROM numerics

テーブルを作成してデータを挿入:

CREATE TABLE `numerics` (
  `float_1` float DEFAULT NULL,
  `float_2` float DEFAULT NULL,
  `double_1` double DEFAULT NULL,
  `double_2` double DEFAULT NULL,
  `decimal_1` decimal(10,5) DEFAULT NULL,
  `decimal_2` decimal(10,5) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `_numerics` 
    (
        `float_1`,
        `float_2`,
        `double_1`,
        `double_2`,
        `decimal_1`,
        `decimal_2`
    )
VALUES
    (
        1.3,
        1.3,
        1.3,
        1.3,
        1.30000,
        1.30000
    );

11

FLOATは最大8桁の精度で浮動小数点数を格納し、4バイトを持ちますが、DOUBLEは最大18桁の精度で浮動小数点数を格納し、8バイトを持ちます。


11

Floatは32ビット(4バイト)で、8桁の精度があります。 Doubleは64ビット(8バイト)で、16桁の精度があります。

精度を上げる必要がある場合は、FloatではなくDoubleを使用してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.