এলিক্সিরে দুই রকমের সংখ্যা আছে, ইন্টিজার আর ফ্লোট।
ফ্লোট হলো এমন সংখ্যা, যার দশমিক বিন্দুর পরে এক বা একাধিক অঙ্ক থাকে। এগুলো ৬৪-বিট ডাবল প্রিসিশন ফ্লোটিং-পয়েন্ট ফরম্যাট ব্যবহার করে।
float = 3.45
# => 3.45
এলিক্সির ফ্লোটের জন্য বৈজ্ঞানিক প্রতীকও সাপোর্ট করে।
1.25e-2
# => 0.0125
ফ্লোট তার রাউন্ডিং এররের জন্য কুখ্যাত।
0.1 + 0.2
# => 0.30000000000000004
তবে এ ধরনের এরর কেবল এলিক্সিরের নয়। সব প্রোগ্রামিং ভাষাতেই এগুলো ঘটে। কারণ আমাদের কম্পিউটারের সব ডেটা বাইনারি কোড হিসেবে সংরক্ষণ ও প্রক্রিয়া করা হয়। বাইনারিতে কেবল সেই ভগ্নাংশগুলোই নিখুঁতভাবে প্রকাশ করা যায়, যাদের হরকে 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