26 ก.พ. 2021 เวลา 06:24 • วิทยาศาสตร์ & เทคโนโลยี
ในอาทิตย์นี้ทำงานไปทำงานมา ก็ได้รู้สิ่งใหม่ด้วยละ ซึ่งก็คือ Floating-point arithmetic นั่นเอง รวมถึงการใช้ float double และ decimal ให้ถูกต้อง
tldr (ยาวไปไม่อ่าน); ในการคำนวณที่ไม่ได้ต้องการความแม่นยำสูงหรือต้องใช้ความเร็ว float กับ double จะได้เปรียบกว่า แต่หากต้องการการคำนวณที่ถูกต้องเป็ะ decimal จะดีกว่า
ใน .NET (C#) เรามีค่าที่เก็บเลขที่มีทศนิยมได้ 3 แบบ ซึ่งก็คือ float double และ decimal ซึ่งคราวนี้ก็จะมีปัญหาว่าเราควรใช้อะไร ในตอนไหน
ความต่างนั้นมีสองอย่างหลักๆ คือ Precision และ Accuracy (ในที่นี้สองคำนี้แตกต่างกันนะ อ่านต่อเลยเดี๋ยวจะมีอธิบาย)
Precision คือสิ่งที่วัดว่ามันไกลแค่ไหนที่เราจะต้องปัด เช่น float ที่มี precision ต่ำ จะเก็บได้สูงสุดแค่ 0.3333333 (ในกรณี 1/3) ในขณะที่ double จะเก็บได้มากกว่าหน่อย 0.333333333333333 ส่วน decimal นั้นจะเก็บได้สูงสุด 0.3333333333333333333333333333 เลยทีเดียว!
ถ้าแบ่งให้อ่านชัดเจนก็จะแบ่งได้ว่า
Float - 7 หลัก (32 bit)
Double - 15-16 หลัก (64 bit)
Decimal - 28-29 เลขนัยสำคัญ (128 bit)
ส่วนในเรื่องของ Accuracy คือความแม่นยำเมื่อมีการคำนวณ
float และ double นั้นเป็น floating binary point types หรือพูดง่ายๆ คือ เป็นการเก็บค่าโดยใช้ binary ในการเก็บ เช่นเดียวกับ integer ซึ่งการเก็บแบบนี้ไม่สามารถแสดงเลขได้ครบทุกเลข ทำให้ค่าที่ได้อาจมีการคลาดเคลื่อน เช่น 0.44 + 0.44 จะได้ออกมาเป็น 0.8799 แทน
ในขณะที่ decimal นั้นเป็น floating decimal point type ซึ่งเก็บตัวเลขเป็นเลขฐาน 10 ทำให้ความแม่นยำในการคำนวณสูงกว่ามาก
คราวนี้ก็จะมีคำถามว่า "เดี๋ยวนะ... ได้คำตอบที่ผิดก็ไม่ดีไม่ใช่เหรอ?"
มันก็อาจจะใช่ ถ้าคุณทำงานด้านการเงินอะนะ แต่ในกรณีที่เราทำการคำนวณทางวิทยาศาสตร์ เราอาจจะไม่ได้ต้องการค่าที่มีความตรงเป๊ะ เพราะบางทีตัวเลขที่เราเอามาคำนวณนั้นก็ไม่ได้แม่นยำอยู่แล้ว
และอีกอย่าง... float ทำงานเร็วกว่า decimal 20 เท่าเลยนะ ถ้าการคำนวณที่ซับซ้อน คนก็มักจะใช้ float หรือ double เพื่อความเร็วที่ดีกว่านั่นเอง
คราวนี้ทำไมมาพูดถึงเรื่องนี้เหรอ? เพราะเจอมากับตัวนี่ละ!!! ตอนแรกก็ใช้ float ตามปกติ แต่เจอพิษ Inaccuracy เข้าไป ก็ต้องเปลี่ยนเป็น decimal ทันทีทันใด
นี่คือเหตุการณ์ที่เกิดขึ้น
บวกครั้งแรก
บวกครั้งที่สอง
1817 + 100.44 = 1917.44 อันนี้ถูก
1917.44 + 100.44 = 2017.8799 ผิดไป 0.0001
คือมันผิดน้อยมากอะ แต่มันก็ผิดไง ซึ่งอันนี้เราต้องการค่าที่ถูกเป๊ะ ก็เลยใช้ float ไม่ได้นั่นเอง
นี่ก็เป็นสิ่งที่ได้เรียนรู้เพิ่มเติมระหว่างกำลังทำงานนั่นเอง!
ใน Week ต่อไปนั้นคาดว่า Command ส่วน Entertainment จะเสร็จทั้งหมดนะ ฮะๆ
โฆษณา