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