MySQL: Apa perbedaan antara float dan double?

110

Memeriksa dalam struktur database baru saya melihat bahwa seseorang mengubah bidang dari float menjadi double. Bertanya-tanya mengapa, saya memeriksa dokumentasi mysql, tetapi jujur ​​tidak mengerti apa bedanya.

Bisakah seseorang menjelaskan?

janpio
sumber

Jawaban:

106

Keduanya mewakili bilangan floating point. A FLOATuntuk DOUBLEangka presisi tunggal, sedangkan a untuk angka presisi ganda.

MySQL menggunakan empat byte untuk nilai presisi tunggal dan delapan byte untuk nilai presisi ganda.

Ada perbedaan besar dari angka floating point dan angka desimal (numerik), yang dapat Anda gunakan dengan DECIMALtipe datanya. Ini digunakan untuk menyimpan nilai data numerik yang tepat, tidak seperti angka floating point, di mana penting untuk menjaga presisi yang tepat, misalnya dengan data moneter.

Daniel Vassallo
sumber
27
dapatkah Anda menjelaskannya dengan contoh
Kailas
4
@Kasus Mengapung dibulatkan dan desimal tidak. Desimal (9,3) bisa jadi misalnya 123456.789 sedangkan jika Anda mencoba menyimpan 123456.789 itu akan dimasukkan sebagai 123456.0 sebagai pelampung.
Blake
76

Mungkin contoh ini bisa menjelaskan.

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

Kami memiliki tabel seperti ini:

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

Untuk perbedaan pertama, kami mencoba memasukkan catatan dengan '1.2' ke setiap bidang:

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

Tabel menunjukkan seperti ini:

SELECT * FROM `test`;

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

Lihat perbedaannya?

Kami mencoba contoh berikutnya:

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

Halo! Kita bisa menemukan perbedaannya seperti ini:

+--------------------+---------+
| fla+flb            | dba+dbb |
+--------------------+---------+
| 2.4000000953674316 |    2.40 |
+--------------------+---------+
Dan.
sumber
1
Mungkin perbandingan yang lebih baik adalah memberikan fla dan flb 2 koma desimal juga. float(10, 2)
Berterima kasih
30

Ganda seperti pelampung, kecuali kenyataan bahwa mereka dua kali lebih besar. Ini memungkinkan akurasi yang lebih besar.

Williham Totland
sumber
Perhatikan bahwa float dan double round setelah beberapa titik. Misalnya 100000.1 dipotong menjadi 100000 sebagai pelampung.
Blake
14

Pikir saya akan menambahkan contoh saya sendiri yang membantu saya melihat perbedaan menggunakan nilai 1.3saat menambahkan atau mengalikan dengan yang lain float, decimaldan double.

1.3float DITAMBAHKAN ke 1.3berbagai jenis:

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

1.3float DIBAGI oleh 1.3jenis yang berbeda:

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

Ini menggunakan MySQL 6.7

Pertanyaan:

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

Buat Tabel dan Masukkan Data:

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
    );
Omar
sumber
11

FLOAT menyimpan angka floating point dengan akurasi hingga delapan tempat dan memiliki empat byte sementara DOUBLE menyimpan angka floating point dengan akurasi hingga 18 tempat dan memiliki delapan byte.

pengguna3902486
sumber
11

Float memiliki 32 bit (4 byte) dengan akurasi 8 tempat. Double memiliki 64 bit (8 byte) dengan akurasi 16 tempat.

Jika Anda membutuhkan akurasi yang lebih baik, gunakan Double daripada Float .

Ravi Patel
sumber