Elixir में संख्याएँ दो तरह की होती हैं: पूर्णांक और दशमलव संख्याएँ।
दशमलव संख्याएँ वे संख्याएँ होती हैं जिनमें दशमलव बिंदु के बाद एक या अधिक अंक होते हैं। ये 64-बिट डबल प्रिसिजन फ्लोटिंग-पॉइंट फॉर्मेट का उपयोग करती हैं।
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