Skip to content

Decimal Python

บทความนี้จะพาผู้อ่านไปทำความเข้าใจเรื่องการใช้ Decimal หรือเลขทศนิยมใน Python กันครับ

สิ่งหนึ่งที่โปรแกรมเมอร์รู้กันนั้นก็คือคอมพิวเตอร์ใช้เลขฐานสองเป็นภาษาเครื่อง คือ 0 และ 1 ไม่ได้ใช้เลขฐานสิบดังที่มนุษย์ ทำให้การใช้ Decimal หรือเลขทศนิยมในเลขฐานสอง จะไม่ตรงกับเลขทศนิยมในเลขฐานสิบได้ หากเราเขียนโปรแกรมเปรีบเทียบเช่น

>>> print (0.05 + 0.05 == 0.1)
True

จะเห็นได้ว่าได้ผลลัพธ์ที่ต้องการในระดับหนึ่ง แต่ถ้าเราเขียนโปรแกรมที่มีการทำงานวนซ้ำกันจำนวนหลาย ๆ ครั้งมาก ๆ กับเลขทศนิยม เช่น

>>> aa = 0.0
>>> for i in range(1000):
    aa += 0.0001
    print(repr(aa))

0.0001
0.0002
0.00030000000000000003

...

0.09980000000000183
0.09990000000000183
0.10000000000000184

>>> print (aa == 1.0)
False

จะเห็นได้ว่าโปรแกรมทำงานไม่ได้ผลลัพธ์ตามที่เราต้องการและออกแบบไว้ หากเราต้องการให้ทำงานเพื่อให้ได้ผลลัพธ์ที่ต้องการ เราต้องทำตามเอกสาร PEP-327 เป็นสเปคของเลขทศนิยมฐานสิบใน Python ทำให้ได้ผลลัพธ์ที่ถูกต้องกว่า อย่าลืม from decimal import Decimal  กันนะครับ เช่น

>>> from decimal import Decimal 
>>> b = Decimal("0.0")
>>> for i in range(1000):
    b += Decimal("0.001")
    print(repr(b))
   
Decimal('0.001')
...
Decimal('1.000')
>>> print(b == Decimal("1.0"))
True

อ่านรายละเอียดเพิ่มเติมได้ที่ https://docs.python.org/3/library/decimal.html
ติดตามบทความต่อไปนะครับ
ขอบคุณครับ

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องที่ต้องการถูกทำเครื่องหมาย *