Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

จุดคงที่ทศนิยมและเลขทศนิยมใน Python


ตัวเลขทศนิยมจะแสดงในหน่วยความจำเป็นเศษส่วนฐาน 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