MySQL: Sự khác biệt giữa float và double là gì?


110

Kiểm tra cấu trúc cơ sở dữ liệu mới, tôi thấy ai đó đã thay đổi một trường từ float thành double. Tự hỏi tại sao, tôi đã kiểm tra tài liệu mysql, nhưng thực sự không hiểu sự khác biệt là gì.

Ai đó có thể giải thích?



1
Tôi đoán ý của bạn là liên kết này: dev.mysql.com/doc/refman/5.0/en/problems-with-float.html
arun

Điều này có thể hữu ích hơn: stackoverflow.com/questions/5150274/…
Ifti Mahmud

Cũng có liên quan: Điểm # 5 tại dev.mysql.com/doc/refman/5.0/en/no-matching-rows.html
rinogo

Câu trả lời:


106

Cả hai đều đại diện cho số dấu phẩy động. A FLOATlà số chính xác đơn, trong khi a DOUBLElà số chính xác kép.

MySQL sử dụng bốn byte cho giá trị độ chính xác đơn và tám byte cho giá trị độ chính xác kép.

Có sự khác biệt lớn so với số dấu phẩy động và số thập phân (số) mà bạn có thể sử dụng với DECIMALkiểu dữ liệu. Điều này được sử dụng để lưu trữ các giá trị dữ liệu số chính xác, không giống như số dấu phẩy động, trong đó điều quan trọng là phải duy trì độ chính xác chính xác, chẳng hạn như với dữ liệu tiền tệ.


27
bạn có thể giải thích bằng ví dụ không
Kailas

4
@Kailas Floats được làm tròn và số thập phân thì không. Ví dụ: số thập phân (9,3) có thể là 123456.789 trong khi nếu bạn cố gắng lưu trữ 123456.789, nó sẽ được chèn dưới dạng 123456.0 dưới dạng float.
Blake

76

Có lẽ ví dụ này có thể giải thích.

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

Chúng tôi có một bảng như thế này:

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

Đối với sự khác biệt đầu tiên, chúng tôi cố gắng chèn một bản ghi có '1,2' vào mỗi trường:

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

Bảng hiển thị như thế này:

SELECT * FROM `test`;

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

Thấy sự khác biệt?

Chúng tôi thử làm ví dụ tiếp theo:

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

Hola! Chúng ta có thể tìm thấy sự khác biệt như thế này:

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

1
Có lẽ một so sánh tốt hơn sẽ là cung cấp cho fla và flb 2 dấu thập phân. float(10, 2)
Biết ơn

30

Đôi giống như phao, ngoại trừ thực tế là chúng lớn gấp đôi. Điều này cho phép độ chính xác cao hơn.


Lưu ý rằng nổi và nhân đôi vòng sau một thời điểm. Ví dụ: 100000.1 cắt ngắn thành 100000 dưới dạng float.
Blake

14

Nghĩ rằng tôi muốn thêm ví dụ của riêng tôi mà đã giúp tôi thấy sự khác biệt bằng cách sử dụng giá trị 1.3khi thêm hoặc nhân với nhau float, decimaldouble.

1.3float THÊM vào 1.3các loại khác nhau:

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

1.3float MULTIPLIED bởi 1.3các loại khác nhau:

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

Điều này đang sử dụng MySQL 6.7

Truy vấn:

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

Tạo bảng và chèn dữ liệu:

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 lưu trữ số dấu phẩy động với độ chính xác lên đến tám vị trí và có bốn byte trong khi DOUBLE lưu trữ số dấu phẩy động với độ chính xác lên đến 18 vị trí và có tám byte.


11

Float có 32 bit (4 byte) với độ chính xác 8 vị trí. Double có 64 bit (8 byte) với độ chính xác 16 vị trí.

Nếu bạn cần độ chính xác cao hơn, hãy sử dụng Double thay vì Float .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.