Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

ป้องกันการปัดเศษทศนิยมใน MySQL ด้วย DECIMAL Precision/Scale


ปัญหา

DECIMAL(7) โดยไม่ระบุ scale = DECIMAL(7,0) → เก็บแค่จำนวนเต็ม ปัดทศนิยมทิ้ง

ตัวอย่างปัญหา

1. สร้างตาราง DECIMAL(7) - ไม่มี scale

mysql> create table stopRoundingDemo 
    -> ( 
    -> Amount DECIMAL(7) 
    -> ); 
Query OK, 0 rows affected (0.67 sec)

2. Insert ค่าทศนิยม

mysql> insert into stopRoundingDemo values(7836.783); 
Query OK, 1 row affected, 1 warning (0.43 sec)
mysql> insert into stopRoundingDemo values(1737.67); 
Query OK, 1 row affected, 1 warning (0.23 sec)
mysql> insert into stopRoundingDemo values(110.50); 
Query OK, 1 row affected, 1 warning (0.33 sec)

มี Warning: Data truncated

3. ดูผล - ถูกปัดเป็นจำนวนเต็ม!

mysql> select * from stopRoundingDemo;
+--------+
| Amount |
+--------+
| 7837   |
| 1738   |
| 111    |
+--------+

แก้ไข: ระบุ Precision และ Scale

รูปแบบ: DECIMAL(precision, scale)

  • Precision (M) = จำนวนหลักทั้งหมด (1-65)
  • Scale (D) = จำนวนหลักทศนิยม (0-30, ต้อง ≤ M)

1. สร้างตารางใหม่ DECIMAL(10,4)

mysql> create table stopRoundingDemo2 
    -> ( 
    -> Amount DECIMAL(10,4) 
    -> ); 
Query OK, 0 rows affected (0.81 sec)

2. Insert ค่าเดิม

mysql> insert into stopRoundingDemo2 values(7836.783); 
Query OK, 1 row affected (0.14 sec)
mysql> insert into stopRoundingDemo2 values(1737.67); 
Query OK, 1 row affected (0.14 sec)
mysql> insert into stopRoundingDemo2 values(110.50); 
Query OK, 1 row affected (0.16 sec)

3. ดูผล - เก็บทศนิยมครบ!

mysql> select * from stopRoundingDemo2;
+-----------+
| Amount    |
+-----------+
| 7836.7830 |
| 1737.6700 |
| 110.5000  |
+-----------+

แนวทางเลือก Precision/Scale

ใช้งานPrecision,Scaleตัวอย่าง
เงิน/สกุลเงินDECIMAL(10,2) หรือ DECIMAL(19,4)99999999.99
เปอร์เซ็นต์/อัตราDECIMAL(5,4)99.9999%
พิกัด GPSDECIMAL(9,6) หรือ DECIMAL(10,7)99.123456°
การวัดวิทยาศาสตร์DECIMAL(15,10)แม่นยำสูง

ALTER TABLE แก้ตารางเดิม

ALTER TABLE stopRoundingDemo MODIFY Amount DECIMAL(10,4);

หมายเหตุ: DECIMAL เก็บเป็น exact fixed-point ไม่มีปัญหา floating point error เหมาะสำหรับการเงิน