เบื้องหลัง

มาตรฐานที่ทุกอย่างในหน้านี้อ้างอิง

ทุกบิตที่คุณเห็นใน Episode 2 มาจาก IEEE 754 binary64 (หรือที่ JS เรียกว่า "double") — มาตรฐานสากลที่กำหนดว่าตัวเลขทศนิยมถูกเก็บเป็นบิตอย่างไร แบ่งเป็น sign (1 บิต) + exponent (11 บิต, biased ด้วย 1023) + mantissa/significand (52 บิต, มี implicit leading "1." ที่ไม่ถูกเก็บจริง)

ทำไม 0.1 เก็บไม่ตรง (สรุปสั้นๆ)

0.1 ในฐานสองคือ 0.0001100110011... (repeating) ไม่จบไม่สิ้น เหมือน 1/3 ในฐานสิบ float64 มีที่เก็บแค่ 52 บิตหลังจุด เลยต้อง "ปัดเศษ" ตัดที่บิตสุดท้าย ค่าที่ได้จริงคือ 0.1000000000000000055511151231257827021181583404541015625 ซึ่งมากกว่า 0.1 จริงนิดเดียว — พอบวกกับ 0.2 (ที่ก็ถูกปัดเศษเหมือนกัน) ผลรวมเลยเพี้ยนไปจากที่ปัดเศษเป็น 0.3 ไว้พอดี

lib ที่เทสต์ไว้แน่นๆ

ส่วน UI/สไตล์ทั้งหมดเป็นงานสร้างสรรค์ ไม่มี "ถูก/ผิด" แบบทดสอบอัตโนมัติได้ เลยไม่ได้เขียนเทสต์ครอบ

แหล่งอ้างอิงเคสอุบัติเหตุ (Episode 4)

เจอบั๊กสยองของตัวเองมาบ้างไหม

ถ้าคุณเคยโดนบั๊กตระกูลนี้เล่นงาน (เงินเพี้ยน, เกมพัง, กราฟขยับผิด) แชร์เรื่องราวของคุณต่อได้เลย — แท็ก #FloatHorror พร้อมลิงก์หน้านี้ ให้ dev คนอื่นได้เห็นว่าไม่ได้มีแค่คุณคนเดียวที่เจอ