[C#] ทำไม int / int แล้วไม่มีทศนิยมหละ

พอดีผมได้ 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 ดีกว่าครับ มีอัลกอริทึมที่เกี่ยวข้องด้วย

    ผม Capture รูปมาจาก Wiki ครับ ถ้าสนใจลองตามไปอ่านได้ครับ https://en.wikipedia.org/wiki/Floating_point
    ผม Capture รูปมาจาก Wiki ครับ ถ้าสนใจลองตามไปอ่านได้ครับ https://en.wikipedia.org/wiki/Floating_point

เข้าใจสาเหตุแล้วการแก้ไขหละ

  • 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.