在 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