در Elixir دو نوع متفاوت عدد وجود دارد: عدد صحیح و عدد اعشاری.
عدد اعشاری عددی است که یک یا چند رقم بعد از جداکنندهی اعشار دارد. این نوع عدد از قالب ممیز شناور با دقت مضاعف ۶۴ بیتی استفاده میکند.
float = 3.45
# => 3.45
Elixir همچنین نماد علمی را برای عددهای اعشاری پشتیبانی میکند.
1.25e-2
# => 0.0125
عددهای اعشاری به خطاهای گرد کردن معروفاند.
0.1 + 0.2
# => 0.30000000000000004
اما این نوع خطاها مختص Elixir نیستند. در همهی زبانهای برنامهنویسی رخ میدهند. دلیلش این است که همهی دادههای روی رایانههای ما بهصورت کد دودویی ذخیره و پردازش میشوند. در مبنای دودویی، تنها کسرهایی که میتوان مخرجشان را بهصورت 2^n نوشت (مثلاً 1/4، 3/8، 5/16) بهطور دقیق بیان میشوند. سایر کسرها بهصورت تقریبی بیان میشوند.
# 3/4
Float.ratio(0.75)
# => {3, 4}
# 3/5
Float.ratio(0.6)
# => {5404319552844595, 9007199254740992}
میتوانید دربارهی این مشکل بیشتر در 0.30000000000000004.com یاد بگیرید. صفحهی Float Toy توضیح گرافیکی زیبایی دارد که نشان میدهد بیتهای یک عدد ممیز شناور چگونه به یک مقدار ممیز شناور واقعی تبدیل میشوند.
عددهای صحیح و اعشاری اگر مقدار یکسانی داشته باشند، میتوانند برابر در نظر گرفته شوند (==). اما چون از دو نوع متفاوتاند، هرگز بهطور دقیق برابر نیستند (===).
1 == 1.0
# => true
1 === 1.0
# => false
عددهای صحیح و اعشاری میتوانند در یک عبارت حسابی واحد با هم ترکیب شوند. استفاده از یک عدد اعشاری در عبارت تضمین میکند که نتیجه هم اعشاری خواهد بود.
2 * 3
# => 6
2 * 3.0
# => 6.0
عددهای اعشاری را میتوان گرد کرد (round)، به بالا گرد کرد (ceil) یا به پایین گرد کرد (floor).
برای اینکه حاصل گرد کردن یک عدد اعشاری هم اعشاری باشد، از توابع ماژول Float استفاده کنید (Float.round، Float.ceil، Float.floor). برای به دست آوردن یک عدد صحیح، از توابع ماژول Kernel استفاده کنید (round، ceil، floor).
روش دیگری برای تبدیل عدد اعشاری به عدد صحیح، بریدن بخش اعشاری آن با trunc است.
Float.ceil(5.2)
# => 6.0
ceil(5.2)
# => 6
trunc(5.2)
# => 5