سطح مقدماتی (Beginner Level)
در برنامهنویسی پایتون، یکی از اولین سوالاتی که برای افراد پیش میآید این است که چرا جمع 0.1 با 0.2 برابر با 0.3 نمیشود. این موضوع به دلیل نحوه ذخیرهسازی اعداد اعشاری (Float) در کامپیوتر است. پایتون دو ماژول قدرتمند decimal و fractions را برای حل این مشکل ارائه کرده است.
۱. مشکل اعداد اعشاری (Float)
اعداد float در کامپیوترها به صورت باینری (مبنای ۲) ذخیره میشوند و نمیتوانند برخی اعداد اعشاری دقیق را نمایش دهند.
۲. استفاده از ماژول Decimal
برای محاسبات مالی و جاهایی که دقت بسیار مهم است، باید از کلاس Decimal استفاده کنید. نکته کلیدی این است که عدد را به صورت رشته (String) به آن بدهید.
# Example 3: Incorrect usage (passing float directly)
# این روش غلط است چون دقت را قبل از تبدیل از دست میدهد
wrong = Decimal(0.1)
# نتیجه چیزی شبیه 0.10000000000000000555... خواهد بود
۳. کار با ماژول Fractions (کسرها)
اگر میخواهید اعداد را دقیقاً به صورت کسری (صورت و مخرج) نگه دارید، ماژول fractions بهترین گزینه است.
سطح پیشرفته (Professional Level)
در سطح حرفهای، کار با Decimal نیازمند مدیریت Context (بافت اجرایی) است. شما میتوانید دقت (Precision) و نحوه گرد کردن (Rounding) را برای کل برنامه تنظیم کنید.
کنترل دقیق Context و Rounding
پایتون به شما اجازه میدهد تعیین کنید محاسبات تا چند رقم اعشار دقت داشته باشند و اعداد چگونه گرد شوند (مثلاً گرد کردن به سمت بالا، پایین، یا نزدیکترین عدد زوج).
نکات فنی و Performance
- سرعت: ماژول
Decimalاز نظر سرعت پردازش کندتر ازfloatمعمولی است. اگر میلیاردها محاسبه دارید و دقت ۱۰۰٪ حیاتی نیست، ازfloatاستفاده کنید. - ترکیب تایپها: شما نمیتوانید
Decimalرا مستقیماً باfloatجمع کنید (پایتون خطا میدهد تا از دست رفتن دقت جلوگیری کند)، اما میتوانید آن را باintجمع کنید.
# 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 تبدیل کنید.