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?
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?
Câu trả lời:
Cả hai đều đại diện cho số dấu phẩy động. A FLOAT
là số chính xác đơn, trong khi a DOUBLE
là 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 DECIMAL
kiể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ệ.
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 |
+--------------------+---------+
float(10, 2)
Đô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.
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.3
khi thêm hoặc nhân với nhau float
, decimal
và double
.
1.3
float THÊM vào 1.3
các loại khác nhau:
|float | double | decimal |
+-------------------+------------+-----+
|2.5999999046325684 | 2.6 | 2.60000 |
1.3
float MULTIPLIED bởi 1.3
cá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
);
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.
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 .