0.5 Why Numbers Are Different
ตัวเลขดูง่ายกว่า text — ไม่ต้องมี encoding แต่มันซ่อนกับดักของตัวเอง
ตัวเลข 3 ชนิด
Section titled “ตัวเลข 3 ชนิด”| ชนิด | ตัวอย่าง | เก็บอะไร | ใช้สำหรับ |
|---|---|---|---|
| Integer | 42, -17 | จำนวนเต็ม, แม่นยำ | นับจำนวน, IDs |
| Float | 3.14, 0.1 | ทศนิยม — ประมาณ | การวัด, วิทยาศาสตร์ |
| Decimal | 199.99 | ทศนิยม — แม่นยำ | เงิน, เปอร์เซ็นต์ |
Floating-Point Shock
Section titled “Floating-Point Shock”0.1 + 0.2 = 0.30000000000000004 😱ทำไม? คอมพิวเตอร์เก็บ float เป็น binary — 0.1 ในฐานสอง เหมือน 1/3 ในฐานสิบ มันไม่มีวันจบ คอมพิวเตอร์ตัดทิ้ง แล้ว error เล็กๆ ก็สะสม
C ให้คุณเลือก byte-width เอง — นี่คือ DNA ของ SQL types:
#include <stdio.h>int main() { printf("int = %zu bytes\n", sizeof(int)); // 4 printf("long = %zu bytes\n", sizeof(long)); // 8 printf("float = %zu bytes\n", sizeof(float)); // 4 printf("double= %zu bytes\n", sizeof(double)); // 8
float f = 0.1f + 0.2f; printf("%.20f\n", f); // 0.30000001192092895508 return 0;}C ทำให้คุณเห็นว่า SMALLINT / INTEGER / BIGINT และ REAL / DOUBLE PRECISION ของ SQL มาจากไหน
=0.1 + 0.2 → 0.3 ✅ ดูถูก=TEXT(0.1 + 0.2, "0.000000000000000000") → 0.300000000000000044 😱Bug เดียวกัน! Sheets แค่ซ่อนมันด้วย display formatting — จริงๆ มันยังเก็บผิดอยู่
ลองเพิ่ม:
=TYPE(123) → 1 (number)=TYPE("123") → 2 (text)0.1 + 0.2 # 0.30000000000000004
from decimal import DecimalDecimal('0.1') + Decimal('0.2') # Decimal('0.3') ✅ แม่นยำ!Python ให้ทั้งสอง: float หลวมๆ เป็น default, Decimal แม่นยำเมื่อต้องการ
SELECT CAST(0.1 AS REAL) + CAST(0.2 AS REAL);-- 0.30000000...
SELECT CAST(0.1 AS NUMERIC(10,2)) + CAST(0.2 AS NUMERIC(10,2));-- 0.30 ✅ แม่นยำ