در Python سه نوع مختلف از اعداد توکار وجود دارد: ints، floats و complex. اما در این تمرین فقط با ints و floats سر و کار خواهید داشت.
ints اعداد صحیح هستند. مثلاً 1234، -10 و 20201278.
اعداد صحیح در Python دارای دقت دلخواه هستند؛ تعداد ارقام تنها به حافظهی در دسترس سیستم میزبان محدود میشود.
floats اعدادی هستند که نقطهی اعشار دارند. مثلاً 0.0، 3.14 و -9.01.
اعداد ممیز شناور معمولاً در Python با استفاده از double در C پیادهسازی میشوند (۱۵ رقم اعشار دقت)، اما نمایش آنها بسته به سیستم میزبان و سایر جزئیات پیادهسازی متفاوت است. این موضوع هنگام کار با اعداد اعشاری میتواند غافلگیرکننده باشد، اما برای بیشتر موقعیتها «بهقدر کافی خوب» است.
میتوانید جزئیات و بحثهای بیشتر را در منابع زیر ببینید:
int() توکارfloat() توکارPython از محاسبات میان ints و floats بهطور کامل پشتیبانی میکند. وقتی این اعداد با عملگرهای دودویی حساب (+، -، *، /، // و %) به کار میروند، اعداد باریکتر را به همتای پهنترشان تبدیل میکند.
Python اعداد ints را باریکتر از floats در نظر میگیرد. بنابراین استفاده از یک عدد اعشاری در یک عبارت تضمین میکند که نتیجه هم اعشاری باشد. اما هنگام تقسیم، نتیجه همیشه اعشاری خواهد بود، حتی اگر فقط از اعداد صحیح استفاده شود.
# The int is widened to a float here, and a float type is returned.
>>> 3 + 4.0
7.0
>>> 3 * 4.0
12.0
>>> 3 - 2.0
1.0
# Division always returns a float.
>>> 6 / 2
3.0
>>> 7 / 4
1.75
# Calculating remainders.
>>> 7 % 4
3
>>> 2 % 4
2
>>> 12.75 % 3
0.75
اگر به نتیجهی صحیح نیاز دارید، میتوانید از // برای حذف بخش اعشاری نتیجه استفاده کنید.
>>> 6 // 2
3
>>> 7 // 4
1
برای تبدیل یک عدد اعشاری به عدد صحیح میتوانید از int() استفاده کنید و برای تبدیل یک عدد صحیح به عدد اعشاری از float().
>>> int(6 / 2)
3
>>> float(1 + 2)
3.0
دوستتان چندلر قصد دارد به کشورهای عجیب و غریب در سراسر جهان سفر کند. متأسفانه مهارتهای ریاضی چندلر خوب نیست. او نگران است که در طول سفرش سر صرافیها کلاه سرش برود، و میخواهد شما یک ماشینحساب تبدیل ارز برایش بسازید. این هم مشخصات موردنظر او برای این برنامه است:
تابع exchange_money() را بسازید که ۲ پارامتر میگیرد:
budget : مبلغی که قصد دارید تبدیل کنید.exchange_rate : مقدار پول داخلی که معادل یک واحد ارز خارجی است.این تابع باید ارزش ارز تبدیلشده را برگرداند.
نکته: اگر واحد پول شما USD است و میخواهید USD را با نرخ تبدیل 1.20 به EUR تبدیل کنید، آنگاه 1.20 USD == 1 EUR.
>>> exchange_money(127.5, 1.2)
106.25
تابع get_change() را بسازید که ۲ پارامتر میگیرد:
budget : مبلغ پول پیش از تبدیل.exchanging_value : مبلغی که برای تبدیل از بودجه برداشت میشود.این تابع باید مبلغی را برگرداند که از بودجه باقی میماند.
>>> get_change(127.5, 120)
7.5
تابع get_value_of_bills() را بسازید که ۲ پارامتر میگیرد:
denomination : ارزش یک اسکناس.number_of_bills : تعداد کل اسکناسها.این باجهی تبدیل فقط با پول نقد در مضربهای مشخصی سر و کار دارد. مبلغی که دریافت میکنید باید بر ارزش یک «اسکناس» یا واحد بخشپذیر باشد؛ این تقسیم ممکن است کسری یا باقیمانده داشته باشد. تابع شما باید فقط ارزش کل اسکناسهایی را که باجه پس میدهد برگرداند (بدون احتساب مبالغ کسری). متأسفانه باجه باقیمانده/پول خرد را بهعنوان یک امتیاز اضافی برای خودش نگه میدارد.
>>> get_value_of_bills(5, 128)
640
تابع get_number_of_bills() را بسازید که پارامترهای amount و denomination را میگیرد.
این تابع باید تعداد اسکناسهای ارز را برگرداند که میتوانید در مبلغ دادهشده دریافت کنید. به عبارت دیگر: چند اسکناس کامل در مبلغ اولیه جا میشود؟ یادتان باشد که فقط اسکناسهای کامل دریافت میکنید، نه کسری از اسکناس، پس تقسیم را بر همین اساس انجام دهید. در واقع دارید به نزدیکترین اسکناس/واحد کامل به سمت پایین گرد میکنید.
>>> get_number_of_bills(127.5, 5)
25
تابع get_leftover_of_bills() را بسازید که پارامترهای amount و denomination را میگیرد.
این تابع باید مبلغ باقیمانده را برگرداند که با توجه به واحد اسکناسها نمیتوان آن را از مبلغ اولیهی شما بازگرداند. خیلی مهم است که بدانید باجه دقیقاً چقدر برای خودش نگه میدارد.
>>> get_leftover_of_bills(127.5, 20)
7.5
تابع exchangeable_value() را بسازید که پارامترهای budget، exchange_rate، spread و denomination را میگیرد.
پارامتر spread همان درصدی است که بهعنوان کارمزد تبدیل گرفته میشود و بهصورت یک عدد صحیح نوشته میشود.
برای تبدیل آن به عدد اعشاری باید آن را بر ۱۰۰ تقسیم کنید.
اگر 1.00 EUR == 1.20 USD و spread برابر 10 باشد، نرخ تبدیل واقعی این میشود: 1.00 EUR == 1.32 USD، چون ۱۰٪ از ۱٫۲۰ برابر ۰٫۱۲ است و این کارمزد اضافی به تبدیل اضافه میشود.
این تابع باید بیشترین مقدار ارز جدید را پس از محاسبهی نرخ تبدیل بهعلاوهی spread برگرداند. یادتان باشد که واحد ارز یک عدد کامل است و نمیتوان آن را به بخشهای کوچکتر تقسیم کرد.
نکته: مقدار برگشتی باید از نوع int باشد.
>>> exchangeable_value(127.25, 1.20, 10, 20)
80
>>> exchangeable_value(127.25, 1.20, 10, 5)
95