พอดีผมได้ Port Code ในส่วน Business Logic อันนึงจาก VB6 มาเป็ C# แทน เพราะดูแล้วเขียนใหม่น่าจะรีด Performance ได้ดีกว่าครับ หลังจากผมใช้เวลาไปประมาณ 1 เดือน ในการยก Code ขึ้นมา Complile ผ่านนะ แต่ Run แล้ว ประกอบกับ UnitTest แล้วผลลัพธ์ผิด พอลอง Debug เข้าไปดูแล้วพบว่า
- C# int หาร int ได้ 0
- VB6 ได้ค่าทศนิยมมาครับ
ถึงตอนนี้เราต้องไปดูที่ C# Specification ครับ โดยตัวภาษา C# แบ่งเรื่อง Division operator เป็น 3 กลุ่มครับ
- Integer Division
- Floating-point Division - ตามหลักของ IEEE 754 arithmetic
- Decimal Division
พออ่านมาถึงจุดนี้แล้ว ทำไม Microsoft ไม่ทำให้ Integer division แล้วได้ทศนิยมออกมาเลย หละ สำหรับผม ขอให้ความเห็น ดังนี้ครับ
- ความเร็ว พื้นฐานคอมพิวเตอร์ที่เราเรียนตอนนี้ยังเป็นระบบ Bit เลข 0 และ 1 ถ้าไม่สนใจทศนิยมมันทำให้กระบวนการคิดสั้นลงมาก (Simple & Fast)
- ไม่ต้องการสนใจพวก Rounding เพราะ ถ้าเราต้องการให้ Integer Division มีทศนิยมให้ได้เนี่ย สิ่งที่เราต้องเจอการ Rounding ครับ จากเหตุผลข้อที่แล้วคอมพิวเตอร์ไม่ได้คิดเลขแบบคนคิดแบบ 0 และ 1 และถ้าเคสที่หารแล้วได้ทศนิยมแบบ 0.6666666666 ระบบต้องมาหาวิธีปัดครับ ดูตามรูปจาก Wiki ดีกว่าครับ มีอัลกอริทึมที่เกี่ยวข้องด้วย
เข้าใจสาเหตุแล้วการแก้ไขหละ
- Casting มันซะถ้าอยากให้ผลลัพธ์มีทศนิยมได้
- เปลี่ยน Data Type ของตัวที่เอามาหาร จาก int ไปเป็น Type อื่น ที่สามารถมีทศนิยมได้
- อย่าลืมว่า ถ้าตัวไตัที่หารกับกลุ่ม Int มี Data Type ที่ใหญ่กว่า Int ได้แก่พวก Double, Decimal เป็นต้น มันมีเรื่อง Numeric Promotion เข้ามาเกี่ยวด้วยนะ อาจจะงงเอาตัวอย่างดีกว่า Decimal / Int = Decimal
- ใช้ Method มาช่วย ไม่ต้องไปเขียนเองนะครับ MS ทำให้แล้วอย่าง Decimal มี Method Divide มาให้ครับ
จบไปแล้วกับใน C# ผมเข้าใจว่าภาษาอื่นๆ มี Concept คล้ายๆกันครับ ถ้าว่างๆผมไปลองกับฝั่ง Java ให้ครับ และอย่าลืมศึกษาพื้นฐานให้เข้าใจก่อน Coding ครับ ^__^
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.