Skip to content

3.2 The Floating-Point Problem

ถ้าคุณเคยเห็น 0.1 + 0.2 = 0.30000000000000004 แล้วงง — ยินดีต้อนรับ นี่ไม่ใช่ bug มันคือข้อจำกัดทางกายภาพของคอมพิวเตอร์

ใน Module 0.5 เราเคยเห็นว่า 0.1 + 0.2 ไม่เท่ากับ 0.3 — ตอนนั้นเรารู้ว่ามันเกิดขึ้น ตอนนี้เราจะเข้าใจว่า ทำไม และที่สำคัญกว่า — จะป้องกันยังไง

ทำไมมันเกิดขึ้น

Section titled “ทำไมมันเกิดขึ้น”

ลองนึกภาพ เศษส่วนที่ไม่มีวันจบ:

  • 1/3 ในฐานสิบ = 0.333333... ไม่มีวันเขียนจบ
  • 0.1 ในฐานสอง = 0.0001100110011... ไม่มีวันจบเหมือนกัน!

คอมพิวเตอร์มี 64 bits เก็บตัวเลข — มันต้อง ตัดทิ้ง ที่ไหนสักที่ ทุกครั้งที่ตัดทิ้ง = error เล็กๆ สะสม

พิมพ์สูตรเหล่านี้:

=0.1 + 0.2 → 0.3 (ดูถูก!)
=TEXT(0.1 + 0.2, "0.00000000000000000") → 0.30000000000000004 (ไม่ถูก!)
=(0.1 + 0.2) = 0.3 → FALSE!

Sheets ซ่อน error ด้วยการปัดเศษตอนแสดงผล — แต่ค่าจริงผิดอยู่ ถ้าคุณเช็คด้วย = จะเจอ FALSE

วิธีแก้ใน Sheets:

=ROUND(0.1 + 0.2, 2) = 0.3 → TRUE

ใช้ ROUND() ก่อนเปรียบเทียบเสมอ ถ้าเกี่ยวกับเงิน

สถานการณ์ห้ามใช้ใช้แทน
ราคาสินค้าREAL / floatNUMERIC(10,2) / Decimal
ยอดรวมใบแจ้งหนี้DOUBLE PRECISIONNUMERIC / integer cents
เปอร์เซ็นต์ภาษีfloatDecimal / NUMERIC(5,4)
น้ำหนักสินค้าfloat ใช้ได้ (ไม่ต้องแม่นยำ 100%)
คะแนนเฉลี่ยfloat ใช้ได้