Στην Elixir υπάρχουν δύο διαφορετικά είδη αριθμών: οι ακέραιοι και οι δεκαδικοί αριθμοί.
Οι δεκαδικοί αριθμοί είναι αριθμοί με ένα ή περισσότερα ψηφία μετά την υποδιαστολή. Χρησιμοποιούν τη μορφή κινητής υποδιαστολής διπλής ακρίβειας 64 bit.
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 έχει μια ωραία, γραφική εξήγηση του πώς τα bits ενός αριθμού κινητής υποδιαστολής μετατρέπονται σε μια πραγματική τιμή κινητής υποδιαστολής.
Οι ακέραιοι και οι δεκαδικοί αριθμοί μπορούν να θεωρηθούν ίσοι (==) αν έχουν την ίδια τιμή. Ωστόσο, επειδή είναι διαφορετικοί τύποι, δεν είναι ποτέ αυστηρά ίσοι (===).
1 == 1.0
# => true
1 === 1.0
# => false
Οι ακέραιοι και οι δεκαδικοί αριθμοί μπορούν να αναμιχθούν σε μία μόνο αριθμητική παράσταση. Η χρήση ενός δεκαδικού αριθμού σε μια παράσταση εξασφαλίζει ότι το αποτέλεσμα θα είναι κι αυτό δεκαδικός αριθμός.
2 * 3
# => 6
2 * 3.0
# => 6.0
Οι δεκαδικοί αριθμοί μπορούν να στρογγυλοποιηθούν (round), να στρογγυλοποιηθούν προς τα πάνω (ceil) ή να στρογγυλοποιηθούν προς τα κάτω (floor).
Για να στρογγυλοποιήσεις έναν δεκαδικό αριθμό σε δεκαδικό αριθμό, χρησιμοποίησε συναρτήσεις από το module Float (Float.round, Float.ceil, Float.floor). Για να πάρεις ακέραιο αντ' αυτού, χρησιμοποίησε συναρτήσεις από το module Kernel (round, ceil, floor).
Μια άλλη μέθοδος για να μετατρέψεις έναν δεκαδικό αριθμό σε ακέραιο είναι να κόψεις το δεκαδικό του μέρος με τη συνάρτηση trunc.
Float.ceil(5.2)
# => 6.0
ceil(5.2)
# => 6
trunc(5.2)
# => 5