查看源代码 Float (Elixir v1.16.2)

用于处理浮点数的函数。

有关浮点数的数学运算,请参阅 Erlang 的 :math 模块。

内核函数

Kernel 模块中也有与浮点数相关的函数。以下是它们列表

已知问题

由于大多数小数无法用浮点二进制表示,并且大多数运算不精确,而是对近似值进行操作,因此浮点数和算术运算中存在一些众所周知的问题。这些问题不是 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/2floor/2

要详细了解浮点运算,请访问

摘要

函数

将浮点数四舍五入到大于或等于 number 的最小浮点数。

将浮点数四舍五入到小于或等于 number 的最大浮点数。

返回浮点数的最大有限值。

返回浮点数的最小有限值。

将二进制解析为浮点数。

计算 baseexponent 次方。

返回一对整数,它们的比率恰好等于原始浮点数,并且分母为正。

将浮点值四舍五入到任意数量的小数位(介于 0 到 15 之间)。

返回一个字符列表,它对应于给定浮点数的最短文本表示。

返回一个二进制文件,它对应于给定浮点数的最短文本表示。

类型

@type precision_range() :: 0..15

函数

链接到此函数

ceil(number, precision \\ 0)

查看源代码
@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
链接到此函数

floor(number, precision \\ 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
@spec parse(binary()) :: {float(), binary()} | :error

将二进制解析为浮点数。

如果成功,则返回一个形式为 {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
链接到此函数

pow(base, exponent)

查看源代码 (自 1.12.0 起)
@spec pow(float(), number()) :: float()

计算 baseexponent 次方。

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
链接到此函数

ratio(float)

查看源代码 (自 1.4.0 起)
@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}
链接到此函数

round(float, precision \\ 0)

查看源代码
@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
@spec to_charlist(float()) :: charlist()

返回一个字符列表,它对应于给定浮点数的最短文本表示。

底层算法根据 Erlang/OTP 版本而变化

  • 对于 OTP >= 24,它使用在“Ryū:快速浮点数到字符串转换”中提出的算法,该算法在 SIGPLAN '2018 编程语言设计和实现会议论文集上发表。

  • 对于 OTP < 24,它使用在“快速准确地打印浮点数”中提出的算法,该算法在 SIGPLAN '1996 编程语言设计和实现会议论文集上发表。

对于可配置的表示形式,请使用 :erlang.float_to_list/2

示例

iex> Float.to_charlist(7.0)
'7.0'
@spec to_string(float()) :: String.t()

返回一个二进制文件,它对应于给定浮点数的最短文本表示。

底层算法根据 Erlang/OTP 版本而变化

  • 对于 OTP >= 24,它使用在“Ryū:快速浮点数到字符串转换”中提出的算法,该算法在 SIGPLAN '2018 编程语言设计和实现会议论文集上发表。

  • 对于 OTP < 24,它使用在“快速准确地打印浮点数”中提出的算法,该算法在 SIGPLAN '1996 编程语言设计和实现会议论文集上发表。

对于可配置的表示形式,请使用 :erlang.float_to_binary/2

示例

iex> Float.to_string(7.0)
"7.0"