เมื่อตรวจสอบโครงสร้างฐานข้อมูลใหม่ฉันพบว่ามีคนเปลี่ยนฟิลด์จาก float เป็น double สงสัยว่าทำไมฉันจึงตรวจสอบเอกสาร mysql แต่ไม่เข้าใจว่าความแตกต่างคืออะไร
ใครช่วยอธิบายหน่อย
เมื่อตรวจสอบโครงสร้างฐานข้อมูลใหม่ฉันพบว่ามีคนเปลี่ยนฟิลด์จาก float เป็น double สงสัยว่าทำไมฉันจึงตรวจสอบเอกสาร mysql แต่ไม่เข้าใจว่าความแตกต่างคืออะไร
ใครช่วยอธิบายหน่อย
คำตอบ:
ทั้งคู่แสดงถึงตัวเลขทศนิยม A ใช้FLOAT
สำหรับความแม่นยำเดียวในขณะที่ a ใช้DOUBLE
สำหรับตัวเลขที่มีความแม่นยำสองเท่า
MySQL ใช้สี่ไบต์สำหรับค่าความแม่นยำเดียวและแปดไบต์สำหรับค่าความแม่นยำสองเท่า
มีความแตกต่างอย่างมากจากตัวเลขทศนิยมและตัวเลขทศนิยม (ตัวเลข) ซึ่งคุณสามารถใช้กับDECIMAL
ประเภทข้อมูลได้ สิ่งนี้ใช้เพื่อเก็บค่าข้อมูลที่เป็นตัวเลขที่แน่นอนซึ่งแตกต่างจากตัวเลขทศนิยมที่การรักษาความแม่นยำที่แน่นอนเป็นสิ่งสำคัญตัวอย่างเช่นข้อมูลที่เป็นตัวเงิน
บางทีตัวอย่างนี้อาจอธิบายได้
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 |
+--------------------+---------+
float(10, 2)
คู่ผสมก็เหมือนกับการลอยตัวยกเว้นกรณีที่มีขนาดใหญ่กว่าสองเท่า สิ่งนี้ช่วยให้มีความแม่นยำมากขึ้น
คิดว่าฉันต้องการเพิ่มตัวอย่างของตัวเองที่ช่วยให้ฉันเห็นความแตกต่างโดยใช้ค่า1.3
เมื่อมีการเพิ่มหรือคูณกับอีกfloat
, และdecimal
double
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
);
FLOAT จัดเก็บตัวเลขทศนิยมที่มีความแม่นยำถึงแปดตำแหน่งและมีสี่ไบต์ในขณะที่ DOUBLE เก็บตัวเลขทศนิยมที่มีความแม่นยำสูงถึง 18 ตำแหน่งและมีแปดไบต์
Floatมี 32 บิต (4 ไบต์) พร้อมความแม่นยำ 8 ตำแหน่ง Doubleมี 64 บิต (8 ไบต์) พร้อมความแม่นยำ 16 ตำแหน่ง
หากคุณต้องการความถูกต้องดีกว่าใช้คู่แทนการลอย