در Elixir دو نوع مختلف عدد وجود دارد: «اعداد صحیح» و «اعداد اعشاری».
اعداد صحیح، اعدادی بدون جزء اعشاری هستند.
integer = 3
# => 3
اعداد اعشاری، اعدادی هستند که یک یا چند رقم پس از جداکنندهی اعشار دارند. این اعداد از قالب اعشاری دقت مضاعف ۶۴ بیتی استفاده میکنند.
float = 3.45
# => 3.45
در ماژولهای Integer و Float میتوانید چند تابع مفید برای کار با این نوعها پیدا کنید. عملگرهای حسابی پایه در ماژول Kernel تعریف شدهاند.
اعداد صحیح و اعشاری را میتوان در یک عبارت حسابی با هم ترکیب کرد. استفاده از یک عدد اعشاری در عبارت باعث میشود نتیجه هم اعشاری باشد.
2 * 3
# => 6
2 * 3.0
# => 6.0
اما وقتی تقسیم میکنید، نتیجه همیشه یک عدد اعشاری خواهد بود، حتی اگر فقط از اعداد صحیح استفاده کنید.
6 / 2
# => 3.0
برای تبدیل یک عدد اعشاری به عدد صحیح، میتوانید جزء اعشاری را با trunc/1 حذف کنید.
در این تمرین کدی مینویسید که به یک فریلنسر کمک میکند با یک مدیر پروژه ارتباط برقرار کند. وظیفهی شما این است که چند ابزار فراهم کنید که نرخهای روزانه و ماهانه را سریع محاسبه میکنند و در صورت نیاز تخفیف دادهشده را هم در نظر میگیرند.
ابتدا چند قاعده بین فریلنسر و مدیر پروژه تعیین میکنیم:
گاهی فریلنسر پیشنهاد میدهد که روی نرخ روزانهاش تخفیف بگذارد (برای نمونه برای وفادارترین مشتریانش یا برای مشتریان غیرانتفاعی).
تخفیفها به شکل اعداد اعشاری مدل میشوند که درصد را نشان میدهند؛ برای نمونه 25.0 یعنی ۲۵ درصد.
تابعی به اسم daily_rate پیادهسازی کنید که نرخ روزانه را با گرفتن نرخ ساعتی به عنوان پارامتر محاسبه کند.
طبق قرارداد، هر روز ۸ ساعت قابلصورتحساب دارد.
FreelancerRates.daily_rate(60)
# => 480.0
نرخ روزانهی برگشتی باید یک عدد اعشاری باشد.
تابعی به اسم apply_discount پیادهسازی کنید که قیمت را پس از تخفیف محاسبه کند.
FreelancerRates.apply_discount(150, 10)
# => 135.0
مقدار برگشتی همیشه باید یک عدد اعشاری باشد و به هیچ شکلی گرد نشود.
تابعی به اسم monthly_rate پیادهسازی کنید که نرخ ماهانهی دارای تخفیف را محاسبه کند.
این تابع دو پارامتر میگیرد: نرخ ساعتی و درصد تخفیف.
FreelancerRates.monthly_rate(77, 10.5)
# => 12130
نرخ ماهانهی برگشتی باید به نزدیکترین عدد صحیح و به سمت بالا (سقف) گرد شود.
تابعی به اسم days_in_budget پیادهسازی کنید که بودجه، نرخ ساعتی و تخفیف را میگیرد و محاسبه میکند که این مبلغ پوشش چند روز کار کامل را میدهد.
FreelancerRates.days_in_budget(20000, 80, 11.0)
# => 35.1
تعداد روزهای برگشتی باید به سمت پایین (کف) و تا یک رقم اعشار گرد شود.