پیش‌نیاز و هدف یادگیری

این بخش، گام 21 از مسیر «پایتون از صفر» است. هدف این درس محاسبهٔ مبلغ با Decimal و قالب خروجی دو رقم اعشار است. پیش‌نیاز: ماژول statistics؛ میانگین و میانه چه فرقی دارند؟. کتابخانهٔ خارجی لازم نیست؛ ماژول‌های استاندارد همراه Python 3 هستند. اگر مفهوم قبلی برایتان ناآشناست، ابتدا مقالهٔ پیش‌نیاز را بخوانید و مثالش را اجرا کنید؛ حفظ‌کردن کد جای فهم ورودی و خروجی را نمی‌گیرد.

مفهوم اصلی به زبان ساده

float برای محاسبات عمومی مفید است ولی همهٔ کسرهای ده‌دهی را دقیق نمایش نمی‌دهد. ماژول decimal عدد ده‌دهی را با قواعد دقت و گردکردن مشخص محاسبه می‌کند. برای حفظ مقدار اولیه، Decimal را از رشته می‌سازیم، نه از float. این تمرین قیمت‌ها را رشتهٔ ده‌دهی می‌گیرد و تعدادها عدد صحیح غیرمنفی‌اند.

مسئلهٔ این درس

در پروژهٔ «فاکتور دقیق با اعشار ده‌دهی» باید یک تابع مستقل بنویسید. میزکار ورودی نمونه را در request.json قرار می‌دهد؛ تابع solve دیکشنری داده را می‌گیرد و نتیجهٔ خود را برمی‌گرداند. در این قرارداد input لازم نیست و خواندن تعاملی از ترمینال ممکن است اجرای ارزیابی را متوقف کند. از مثال زیر شروع کنید و پیش از اجرای آن، شکل نتیجه را حدس بزنید.

نمونه‌کد قابل اجرا

from decimal import Decimal, ROUND_HALF_UP

def solve(data):
    total = sum((Decimal(item['price']) * item['quantity'] for item in data['items']), Decimal('0'))
    return {'total': str(total.quantize(Decimal('0.01'), rounding=ROUND_HALF_UP))}

print(solve({'items': [{'price': '0.10', 'quantity': 3}]}))

نتیجهٔ مورد انتظار

{
  "total": "0.30"
}

توضیح مرحله‌به‌مرحله

هر قیمت رشته‌ای با Decimal خوانده و در quantity ضرب می‌شود. جمع از Decimal("0") آغاز می‌شود تا همهٔ محاسبه‌ها ده‌دهی بمانند. در پایان quantize با 0.01 و ROUND_HALF_UP اعمال می‌شود؛ یعنی نیم‌صدم رو به بالا گرد می‌شود. خروجی total عمداً رشته است تا همیشه دو رقم اعشار، حتی برای صفر، حفظ شود.

قرارداد ورودی و خروجی

مثال فقط یک ورودی است، نه همهٔ مسئله. مقدارها را از data بخوانید و جواب نمونه را ثابت در برنامه ننویسید. نام کلیدها، نوع عدد و رشته و ترتیب فهرست‌ها بخشی از قراردادند. در پروژه، بخش پایانی main.py نتیجهٔ تابع را در result.json ذخیره می‌کند؛ آن بخش را نگه دارید. موفقیت اجرای برنامه با درست‌بودن پاسخ و قبولی ارزیابی یکسان نیست.

خطای رایج و راه تشخیص

Decimal(0.1) ابتدا تقریب float را دریافت می‌کند و دیگر نمایش دقیق ورودی ده‌دهی نیست. Decimal("0.1") را انتخاب کنید. گردکردن هر سطر و گردکردن فقط جمع نهایی ممکن است دو نتیجهٔ متفاوت بدهند؛ قرارداد این پروژه فقط جمع نهایی را گرد می‌کند.

تمرین مستقل و خودآزمایی

سه واحد با قیمت "0.10" و یک واحد با قیمت "0.105" را جدا بررسی کنید. نتیجهٔ جمع خالی هم باید "0.00" باشد، نه عدد صفر یا رشتهٔ بدون اعشار.

برای هر آزمایش، ورودی، خروجی مورد انتظار و خروجی واقعی را جدا بنویسید. اگر تفاوتی دیدید، یک نمونهٔ کوچک‌تر بسازید و تغییر را دوباره امتحان کنید. به جای اجرای چند تغییر هم‌زمان، هر بار یک فرض را بررسی کنید. پس از فهم نمونه، پروژهٔ مرتبط را در میزکار حل کنید؛ ارزیابی با چند ورودی متفاوت انجام می‌شود و پاسخ ثابت نمونه پذیرفته نخواهد شد.

گام بعدی

موضوع‌های این درس: decimal · Quantize · Rounding. اگر می‌توانید دلیل هر خط را توضیح دهید و ورودی تازه‌ای را بدون دست‌کاری منطق اصلی حل کنید، به مقالهٔ بعدی بروید. هدف مسیر مقدماتی، تسلط بر همین رفتارهای کوچک و قابل آزمایش است؛ برای شروع پروژه‌های یادگیری ماشین عجله نکنید.

منابع و مطالعهٔ بیشتر

برای بررسی جزئیات و ادامهٔ مطالعه؛ متن این راهنما مستقلاً برای نوونتیکس نوشته شده است.