查看源代码 Float (Elixir v1.16.2)
用于处理浮点数的函数。
有关浮点数的数学运算,请参阅 Erlang 的 :math
模块。
内核函数
在 Kernel
模块中也有与浮点数相关的函数。以下是它们列表
Kernel.round/1
: 将数字四舍五入到最接近的整数。Kernel.trunc/1
: 返回数字的整数部分。
已知问题
由于大多数小数无法用浮点二进制表示,并且大多数运算不精确,而是对近似值进行操作,因此浮点数和算术运算中存在一些众所周知的问题。这些问题不是 Elixir 特有的,而是浮点表示本身的特性。
例如,数字 0.1 和 0.01 就是其中两个,这意味着 0.1 的平方结果既不是 0.01,也不是最接近的可表示数字。以下是这种情况发生的原因
- 最接近 0.1 的可表示数字是 0.1000000014
- 最接近 0.01 的可表示数字是 0.0099999997
- 0.1 * 0.1 应该返回 0.01,但因为 0.1 实际上是 0.1000000014,所以结果是 0.01000000000000002,并且因为这不是最接近 0.01 的可表示数字,所以您将获得此操作的错误结果
还有一些其他已知问题,例如地板或舍入数字。有关详细信息,请参阅 round/2
和 floor/2
。
要详细了解浮点运算,请访问
摘要
函数
将浮点数四舍五入到大于或等于 number
的最小浮点数。
将浮点数四舍五入到小于或等于 number
的最大浮点数。
返回浮点数的最大有限值。
返回浮点数的最小有限值。
将二进制解析为浮点数。
计算 base
的 exponent
次方。
返回一对整数,它们的比率恰好等于原始浮点数,并且分母为正。
将浮点值四舍五入到任意数量的小数位(介于 0 到 15 之间)。
返回一个字符列表,它对应于给定浮点数的最短文本表示。
返回一个二进制文件,它对应于给定浮点数的最短文本表示。
类型
函数
@spec ceil(float(), precision_range()) :: float()
将浮点数四舍五入到大于或等于 number
的最小浮点数。
ceil/2
还接受一个精度值,将浮点值向上舍入到任意数量的小数位(介于 0 到 15 之间)。
操作是在二进制浮点上执行的,没有转换为十进制。
ceil/2
对浮点数的行为可能会令人惊讶。例如
iex> Float.ceil(-12.52, 2)
-12.51
人们可能期望它向上舍入到 -12.52。这不是错误。大多数小数无法表示为二进制浮点数,因此上面的数字在内部表示为 -12.51999999,这解释了上面的行为。
此函数始终返回浮点数。可以使用 Kernel.trunc/1
将结果截断为整数。
示例
iex> Float.ceil(34.25)
35.0
iex> Float.ceil(-56.5)
-56.0
iex> Float.ceil(34.251, 2)
34.26
iex> Float.ceil(-0.01)
-0.0
@spec floor(float(), precision_range()) :: float()
将浮点数四舍五入到小于或等于 number
的最大浮点数。
floor/2
还接受一个精度值,将浮点值向下舍入到任意数量的小数位(介于 0 到 15 之间)。操作是在二进制浮点上执行的,没有转换为十进制。
此函数始终返回一个浮点数。可以使用 Kernel.trunc/1
将结果截断为整数。
已知问题
floor/2
对浮点数的行为可能会令人惊讶。例如
iex> Float.floor(12.52, 2)
12.51
人们可能期望它向下舍入到 12.52。这不是错误。大多数小数无法表示为二进制浮点数,因此上面的数字在内部表示为 12.51999999,这解释了上面的行为。
示例
iex> Float.floor(34.25)
34.0
iex> Float.floor(-56.5)
-57.0
iex> Float.floor(34.259, 2)
34.25
@spec max_finite() :: float()
返回浮点数的最大有限值。
示例
iex> Float.max_finite()
1.7976931348623157e308
@spec min_finite() :: float()
返回浮点数的最小有限值。
示例
iex> Float.min_finite()
-1.7976931348623157e308
将二进制解析为浮点数。
如果成功,则返回一个形式为 {float, remainder_of_binary}
的元组;当二进制文件无法强制转换为有效的浮点数时,将返回原子 :error
。
如果浮点数的大小超过 1.7976931348623157e+308
的最大大小,则即使文本表示本身可能是格式良好的,也会返回 :error
。
如果您想将字符串格式的浮点数直接转换为浮点数,可以使用 String.to_float/1
。
示例
iex> Float.parse("34")
{34.0, ""}
iex> Float.parse("34.25")
{34.25, ""}
iex> Float.parse("56.5xyz")
{56.5, "xyz"}
iex> Float.parse("pi")
:error
iex> Float.parse("1.7976931348623159e+308")
:error
计算 base
的 exponent
次方。
base
必须是浮点数,exponent
可以是任何数字。但是,如果给出了负底数和小数指数,则会引发 ArithmeticError
。
它始终返回浮点数。有关返回整数的求幂运算,请参阅 Integer.pow/2
。
示例
iex> Float.pow(2.0, 0)
1.0
iex> Float.pow(2.0, 1)
2.0
iex> Float.pow(2.0, 10)
1024.0
iex> Float.pow(2.0, -1)
0.5
iex> Float.pow(2.0, -3)
0.125
iex> Float.pow(3.0, 1.5)
5.196152422706632
iex> Float.pow(-2.0, 3)
-8.0
iex> Float.pow(-2.0, 4)
16.0
iex> Float.pow(-1.0, 0.5)
** (ArithmeticError) bad argument in arithmetic expression
@spec ratio(float()) :: {integer(), pos_integer()}
返回一对整数,它们的比率恰好等于原始浮点数,并且分母为正。
示例
iex> Float.ratio(0.0)
{0, 1}
iex> Float.ratio(3.14)
{7070651414971679, 2251799813685248}
iex> Float.ratio(-3.14)
{-7070651414971679, 2251799813685248}
iex> Float.ratio(1.5)
{3, 2}
iex> Float.ratio(-1.5)
{-3, 2}
iex> Float.ratio(16.0)
{16, 1}
iex> Float.ratio(-16.0)
{-16, 1}
@spec round(float(), precision_range()) :: float()
将浮点值四舍五入到任意数量的小数位(介于 0 到 15 之间)。
舍入方向始终向半数进位。操作是在二进制浮点上执行的,没有转换为十进制。
此函数仅接受浮点数,并且始终返回浮点数。如果您想要一个接受浮点数和整数并始终返回整数的函数,请使用 Kernel.round/1
。
已知问题
round/2
对浮点数的行为可能会令人惊讶。例如
iex> Float.round(5.5675, 3)
5.567
人们可能期望它向上舍入到 5.568。这不是错误。大多数小数无法表示为二进制浮点数,因此上面的数字在内部表示为 5.567499999,这解释了上面的行为。如果您想要十进制的精确舍入,则必须使用十进制库。上面的行为也符合参考实现,例如 David M. Gay 的“正确舍入的二进制-十进制和十进制-二进制转换”。
示例
iex> Float.round(12.5)
13.0
iex> Float.round(5.5674, 3)
5.567
iex> Float.round(5.5675, 3)
5.567
iex> Float.round(-5.5674, 3)
-5.567
iex> Float.round(-5.5675)
-6.0
iex> Float.round(12.341444444444441, 15)
12.341444444444441
iex> Float.round(-0.01)
-0.0
返回一个字符列表,它对应于给定浮点数的最短文本表示。
底层算法根据 Erlang/OTP 版本而变化
对于 OTP >= 24,它使用在“Ryū:快速浮点数到字符串转换”中提出的算法,该算法在 SIGPLAN '2018 编程语言设计和实现会议论文集上发表。
对于 OTP < 24,它使用在“快速准确地打印浮点数”中提出的算法,该算法在 SIGPLAN '1996 编程语言设计和实现会议论文集上发表。
对于可配置的表示形式,请使用 :erlang.float_to_list/2
。
示例
iex> Float.to_charlist(7.0)
'7.0'
返回一个二进制文件,它对应于给定浮点数的最短文本表示。
底层算法根据 Erlang/OTP 版本而变化
对于 OTP >= 24,它使用在“Ryū:快速浮点数到字符串转换”中提出的算法,该算法在 SIGPLAN '2018 编程语言设计和实现会议论文集上发表。
对于 OTP < 24,它使用在“快速准确地打印浮点数”中提出的算法,该算法在 SIGPLAN '1996 编程语言设计和实现会议论文集上发表。
对于可配置的表示形式,请使用 :erlang.float_to_binary/2
。
示例
iex> Float.to_string(7.0)
"7.0"