خانه / آموزش‌ها / اعداد دقیق با Decimal و Fractions در پایتون

اعداد دقیق با Decimal و Fractions در پایتون

🐍 HomeOfPython
|
📅 1404/10/22

سطح مقدماتی (Beginner Level)

در برنامه‌نویسی پایتون، یکی از اولین سوالاتی که برای افراد پیش می‌آید این است که چرا جمع 0.1 با 0.2 برابر با 0.3 نمی‌شود. این موضوع به دلیل نحوه ذخیره‌سازی اعداد اعشاری (Float) در کامپیوتر است. پایتون دو ماژول قدرتمند decimal و fractions را برای حل این مشکل ارائه کرده است.

۱. مشکل اعداد اعشاری (Float)

اعداد float در کامپیوترها به صورت باینری (مبنای ۲) ذخیره می‌شوند و نمی‌توانند برخی اعداد اعشاری دقیق را نمایش دهند.

Python

۲. استفاده از ماژول Decimal

برای محاسبات مالی و جاهایی که دقت بسیار مهم است، باید از کلاس Decimal استفاده کنید. نکته کلیدی این است که عدد را به صورت رشته (String) به آن بدهید.

Python
python
# Example 3: Incorrect usage (passing float directly)
# این روش غلط است چون دقت را قبل از تبدیل از دست می‌دهد
wrong = Decimal(0.1) 
# نتیجه چیزی شبیه 0.10000000000000000555... خواهد بود

۳. کار با ماژول Fractions (کسرها)

اگر می‌خواهید اعداد را دقیقاً به صورت کسری (صورت و مخرج) نگه دارید، ماژول fractions بهترین گزینه است.

Python

سطح پیشرفته (Professional Level)

در سطح حرفه‌ای، کار با Decimal نیازمند مدیریت Context (بافت اجرایی) است. شما می‌توانید دقت (Precision) و نحوه گرد کردن (Rounding) را برای کل برنامه تنظیم کنید.

کنترل دقیق Context و Rounding

پایتون به شما اجازه می‌دهد تعیین کنید محاسبات تا چند رقم اعشار دقت داشته باشند و اعداد چگونه گرد شوند (مثلاً گرد کردن به سمت بالا، پایین، یا نزدیک‌ترین عدد زوج).

Python

نکات فنی و Performance

  1. سرعت: ماژول Decimal از نظر سرعت پردازش کندتر از float معمولی است. اگر میلیاردها محاسبه دارید و دقت ۱۰۰٪ حیاتی نیست، از float استفاده کنید.
  2. ترکیب تایپ‌ها: شما نمی‌توانید Decimal را مستقیماً با float جمع کنید (پایتون خطا می‌دهد تا از دست رفتن دقت جلوگیری کند)، اما می‌توانید آن را با int جمع کنید.
python
# Static Snippet: Type Mixing Rules
from decimal import Decimal

d = Decimal('5.5')

# مجاز: جمع با عدد صحیح
res_int = d + 10  # خروجی Decimal('15.5')

# غیرمجاز: جمع با فلوت (باعث TypeError می‌شود)
# res_float = d + 0.5 

تبدیل دقیق کسر به اعشار

گاهی نیاز است یک کسر را با دقت خاصی به Decimal تبدیل کنید.

Python