MySQL: float และ double ต่างกันอย่างไร


112

เมื่อตรวจสอบโครงสร้างฐานข้อมูลใหม่ฉันพบว่ามีคนเปลี่ยนฟิลด์จาก float เป็น double สงสัยว่าทำไมฉันจึงตรวจสอบเอกสาร mysql แต่ไม่เข้าใจว่าความแตกต่างคืออะไร

ใครช่วยอธิบายหน่อย



1
ฉันเดาว่าคุณหมายถึงลิงค์นี้: dev.mysql.com/doc/refman/5.0/en/pro issues
arun

สิ่งนี้อาจเป็นประโยชน์มากขึ้น: stackoverflow.com/questions/5150274/…
Ifti Mahmud

เกี่ยวข้องด้วย: จุด # 5 ที่dev.mysql.com/doc/refman/5.0/th/no-matching-rows.html
rinogo

คำตอบ:


106

ทั้งคู่แสดงถึงตัวเลขทศนิยม A ใช้FLOATสำหรับความแม่นยำเดียวในขณะที่ a ใช้DOUBLEสำหรับตัวเลขที่มีความแม่นยำสองเท่า

MySQL ใช้สี่ไบต์สำหรับค่าความแม่นยำเดียวและแปดไบต์สำหรับค่าความแม่นยำสองเท่า

มีความแตกต่างอย่างมากจากตัวเลขทศนิยมและตัวเลขทศนิยม (ตัวเลข) ซึ่งคุณสามารถใช้กับDECIMALประเภทข้อมูลได้ สิ่งนี้ใช้เพื่อเก็บค่าข้อมูลที่เป็นตัวเลขที่แน่นอนซึ่งแตกต่างจากตัวเลขทศนิยมที่การรักษาความแม่นยำที่แน่นอนเป็นสิ่งสำคัญตัวอย่างเช่นข้อมูลที่เป็นตัวเงิน


27
คุณช่วยอธิบายให้ละเอียดได้ไหม
Kailas

4
@Kailas Floats ปัดเศษและทศนิยมไม่ได้ ทศนิยม (9,3) อาจเป็นตัวอย่าง 123456.789 ในขณะที่หากคุณพยายามจัดเก็บ 123456.789 มันจะถูกแทรกเป็น 123456.0 เป็นทศนิยม
Blake

77

บางทีตัวอย่างนี้อาจอธิบายได้

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)
กตัญญู

30

คู่ผสมก็เหมือนกับการลอยตัวยกเว้นกรณีที่มีขนาดใหญ่กว่าสองเท่า สิ่งนี้ช่วยให้มีความแม่นยำมากขึ้น


สังเกตว่าลอยและสองรอบหลังจากจุดหนึ่ง ตัวอย่างเช่น 100000.1 จะตัดทอนเป็น 100000 เป็นทศนิยม
Blake

14

คิดว่าฉันต้องการเพิ่มตัวอย่างของตัวเองที่ช่วยให้ฉันเห็นความแตกต่างโดยใช้ค่า1.3เมื่อมีการเพิ่มหรือคูณกับอีกfloat, และdecimaldouble

1.3ลอยเพิ่มเป็น1.3ประเภทต่างๆ:

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

1.3ลอย MULTIPLIED ตาม1.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 จัดเก็บตัวเลขทศนิยมที่มีความแม่นยำถึงแปดตำแหน่งและมีสี่ไบต์ในขณะที่ DOUBLE เก็บตัวเลขทศนิยมที่มีความแม่นยำสูงถึง 18 ตำแหน่งและมีแปดไบต์


11

Floatมี 32 บิต (4 ไบต์) พร้อมความแม่นยำ 8 ตำแหน่ง Doubleมี 64 บิต (8 ไบต์) พร้อมความแม่นยำ 16 ตำแหน่ง

หากคุณต้องการความถูกต้องดีกว่าใช้คู่แทนการลอย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.