ตัวเลขทศนิยมจะแสดงในหน่วยความจำเป็นเศษส่วนฐาน 2 ผลที่ตามมาก็คือ การคำนวณเลขทศนิยมอาจเป็นเรื่องแปลกในบางครั้ง การเติม 0.1 และ 0.2 สามารถให้ผลลัพธ์ที่น่ารำคาญได้ดังนี้ -
<ก่อน>>>> 0.1 + 0.20.30000000000004อันที่จริงนี่คือลักษณะของการแสดงจุดทศนิยมแบบไบนารี นี้แพร่หลายในภาษาการเขียนโปรแกรมใดๆ Python มีโมดูลทศนิยมเพื่อคำนวณเลขทศนิยมอย่างรวดเร็วและถูกต้อง
โมดูลทศนิยมได้รับการออกแบบเพื่อแสดงจุดลอยตัวตรงตามที่ต้องการ และผลการดำเนินการทางคณิตศาสตร์ก็สอดคล้องกับความคาดหวัง ระดับความแม่นยำของการแสดงและการทำงานสามารถตั้งค่าได้มากถึง 28 ตำแหน่ง
โมดูลทศนิยมกำหนดคลาสทศนิยม ออบเจ็กต์ทศนิยมสามารถประกาศได้โดยการระบุจำนวนเต็ม สตริงที่มีการแสดงตัวเลข หรือทูเพิลเป็นพารามิเตอร์ให้กับคอนสตรัคเตอร์
>>> จากการนำเข้าทศนิยม>>> d1 =ทศนิยม(10)>>> d1Decimal('10')>>> d2 =ทศนิยม('10')>>> d2ทศนิยม('10')ก่อน>พารามิเตอร์ทูเพิลประกอบด้วยสามองค์ประกอบ เครื่องหมาย (0 สำหรับค่าบวก 1 สำหรับค่าลบ) ทูเพิลของหลักและเลขชี้กำลัง ตัวอย่างเช่น
>>> d3 =ทศนิยม((1, (1, 2,3, 4), 2))>>> d3Decimal('-1.234E+5')วิธีที่สะดวกกว่าในการแสดงหมายเลขทศนิยมของความแม่นยำเฉพาะคือการรับสภาพแวดล้อมบริบทของเธรดปัจจุบันโดย getcontext() finction และตั้งค่าความแม่นยำสำหรับวัตถุทศนิยม
>>> จากการนำเข้าทศนิยม, getcontext>>> getcontext().prec =5>>>> d3 =Decimal(10)>>> d4 =Decimal(3)>>> d3/d4Decimal('3.3333' )บริบทคือสภาพแวดล้อมสำหรับการดำเนินการทางคณิตศาสตร์ที่ใช้ในการกำหนดความแม่นยำและกำหนดกฎการปัดเศษ ตลอดจนจำกัดช่วงสำหรับเลขชี้กำลัง
ทศนิยม.getcontext() − ส่งคืนบริบทปัจจุบันสำหรับเธรดที่ใช้งานอยู่
ทศนิยม.setcontext(c) - ตั้งค่าบริบทปัจจุบันสำหรับเธรดที่ใช้งานอยู่เป็น c.
ค่าคงที่โหมดการปัดเศษต่อไปนี้ถูกกำหนดในโมดูลทศนิยม -
ROUND_CEILING | วงเวียนสู่อนันตภาพ |
ROUND_DOWN | ปัดเศษไปทางศูนย์ |
ROUND_FLOOR | ปัดเศษไปทาง -อินฟินิตี้ |
ROUND_HALF_DOWN | ปัดเศษให้ใกล้ที่สุดโดยเสมอกันไปทางศูนย์ |
ROUND_HALF_EVEN | ปัดเศษให้ใกล้ที่สุดด้วยความสัมพันธ์ที่เข้าใกล้จำนวนเต็มคู่ที่ใกล้เคียงที่สุด |
ROUND_HALF_UP | ปัดเศษให้ใกล้ที่สุดโดยมีค่าเสมอกันจากศูนย์ |
ROUND_UP | ปัดเศษจากศูนย์ |
ROUND_05UP | ปัดเศษจากศูนย์หากหลักสุดท้ายหลังจากปัดเศษไปทางศูนย์จะเป็น 0 หรือ 5; มิฉะนั้นให้ปัดเศษไปทางศูนย์ |
ข้อมูลโค้ดต่อไปนี้ใช้พารามิเตอร์ความแม่นยำและการปัดเศษของออบเจ็กต์บริบท
>>> จากการนำเข้าทศนิยม *>>> getcontext().prec =5>>> getcontext().rounding =ROUND_UP>>> d1 =Decimal(100)>>> d2 =Decimal(6)>>> d1/d2Decimal('16.667')
การคำนวณทางคณิตศาสตร์ของวัตถุทศนิยม
การคำนวณทางคณิตศาสตร์ปกติทั้งหมดจะทำบนวัตถุทศนิยม เช่นเดียวกับการลอยตัวปกติ
>>> a =Decimal('2.4')>>> b =Decimal('1.2')>>> a + bDecimal('3.6')>>> a - bDecimal('1.2')>>> b - aDecimal('-1.2')>>> a * bDecimal('2.88')>>> a / bDecimal('2')
การคำนวณทางคณิตศาสตร์สามารถทำได้บนตัวถูกดำเนินการทศนิยมหนึ่งตัวและตัวถูกดำเนินการจำนวนเต็มหนึ่งตัว อย่างไรก็ตาม การดำเนินการกับวัตถุทศนิยมปกติจะไม่ถูกต้อง
>>> a =Decimal('2.4')>>> c =2.1>>> a + cTraceback (การโทรล่าสุดครั้งล่าสุด):File "" บรรทัดที่ 1 ใน a +cTypeError:ประเภทตัวถูกดำเนินการที่ไม่รองรับสำหรับ +:'decimal.Decimal' และ 'float'
มีข้อยกเว้นเหมือนกันสำหรับการดำเนินการทางคณิตศาสตร์ทั้งหมด
ลักษณะการทำงานของตัวดำเนินการส่วนที่เหลือ (%) กับวัตถุทศนิยมจะแตกต่างจากประเภทตัวเลขปกติเล็กน้อย ในที่นี้ เครื่องหมายของผลลัพธ์คือเงินปันผลมากกว่าตัวหาร
>>> -7%32>>> 7%-3-2>>> ทศนิยม(-7) % ทศนิยม(3)ทศนิยม('-1')>>> ทศนิยม(7) % ทศนิยม(- 3)ทศนิยม('1')
ทศนิยม.from_float() - ฟังก์ชั่นนี้แปลงทศนิยมปกติเป็นวัตถุทศนิยมด้วยการแสดงไบนารีที่แน่นอน เนื่องจาก from_float(0.1) และ Decimal('0.1') จึงไม่เหมือนกัน
>>> d1 =ทศนิยม('0.1')>>> d2 =ทศนิยม.จาก_float(0.1)>>> d1,d2(ทศนิยม('0.1'), ทศนิยม('0.1000000000000000055511151231257827021181583404541015625'))
บทความนี้อธิบายการใช้ฟังก์ชันที่กำหนดไว้ในโมดูลทศนิยมของไลบรารีมาตรฐาน Python