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

MySQL ดึงเฉพาะทศนิยม (Floating-point) จากคอลัมน์ DECIMAL

กรองเฉพาะค่าที่มีทศนิยม (ไม่ใช่ Integer)

ใช้ FLOOR() หรือ TRUNCATE() เปรียบเทียบกับค่าเดิม ถ้าไม่เท่ากัน = มีทศนิยม

ตัวอย่าง

CREATE TABLE DemoTable628 (Value DECIMAL(10,2));

INSERT INTO DemoTable628 VALUES
(10.97), (20.04), (12.00), (89.56);

Query: ค่าที่มีทศนิยม (≠ Integer)

SELECT * FROM DemoTable628 
WHERE Value != FLOOR(Value);

ผลลัพธ์: 10.97, 20.04, 89.56 (ตัด 12.00 ออก)

+-------+
| Value |
+-------+
| 10.97 |
| 20.04 |
| 89.56 |
+-------+

วิธีอื่นๆ

MethodQueryหมายเหตุ
FLOORValue != FLOOR(Value)Standard, เร็ว
TRUNCATEValue != TRUNCATE(Value, 0)เหมือน FLOOR สำหรับค่าบวก
MODMOD(Value, 1) != 0Modulo 1 = ส่วนทศนิยม
CASTValue != CAST(Value AS UNSIGNED)Cast เป็น Integer เปรียบเทียบ
REGEXPValue REGEXP '\\.[1-9]'Regex หาจุดทศนิยมตามด้วย 1-9

⚠️ Floating Point Precision Issue

-- ปัญหา Binary Floating Point
SELECT 0.1 + 0.2;  -- 0.30000000000000004

-- ใช้ DECIMAL แทน FLOAT/DOUBLE
CREATE TABLE t (val DECIMAL(10,2));  -- Exact

-- ถ้าต้องใช้ FLOAT ใช้ EPSILON Comparison
WHERE ABS(Value - FLOOR(Value)) > 0.000001

กรณีใช้งานจริง

  • Financial: หา Transaction ที่มีเซนต์ (ไม่ใช่จำนวนเต็มบาท)
  • Quality Check: ตรวจสอบ Data Entry ว่ากรอกทศนิยมครบ
  • Pricing: แยกสินค้าราคา .99, .50 จากราคาเต็ม

ตัวอย่าง: แยก Integer Part และ Decimal Part

SELECT 
    Value,
    FLOOR(Value) AS integer_part,
    Value - FLOOR(Value) AS decimal_part,
    CASE WHEN Value = FLOOR(Value) THEN 'Integer' ELSE 'Decimal' END AS type
FROM DemoTable628;

ผลลัพธ์:

+-------+----------------+--------------+---------+
| Value | integer_part   | decimal_part | type    |
+-------+----------------+--------------+---------+
| 10.97 | 10             | 0.97         | Decimal |
| 20.04 | 20             | 0.04         | Decimal |
| 12.00 | 12             | 0.00         | Integer |
| 89.56 | 89             | 0.56         | Decimal |
+-------+----------------+--------------+---------+