檢視原始碼 Float (Elixir v1.16.2)

用於處理浮點數的函式。

有關浮點數的數學運算,請參閱 Erlang 的 :math 模組。

Kernel 函式

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.010000000000000002,而且由於這不是最接近 0.01 的可表示數字,因此您會得到此運算的錯誤結果

還有其他已知問題,例如取整或四捨五入數字。請參閱 round/2floor/2 以取得更多詳細資訊。

如需深入了解浮點算術,請造訪

摘要

函數

將浮點數四捨五入到小於或等於 number 的最小浮點數。

將浮點數四捨五入到小於或等於 number 的最大浮點數。

傳回浮點數的最大有限值。

傳回浮點數的最小有限值。

將二進位數字解析為浮點數。

計算 base 乘以 exponent 的次方。

傳回一對整數,其比率與原始浮點數完全相等,且分母為正數。

將浮點數值四捨五入到任意數量的分數位數(介於 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()

計算 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
連結到此函數

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,它使用 SIGPLAN '2018 程式語言設計與實作會議論文中提出的「Ryū:快速的浮點數轉字串轉換」演算法。

  • 對於 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,它使用 SIGPLAN '2018 程式語言設計與實作會議論文中提出的「Ryū:快速的浮點數轉字串轉換」演算法。

  • 對於 OTP < 24,它使用 SIGPLAN '1996 程式語言設計與實作會議論文中提出的「快速且精確地列印浮點數」演算法。

對於可設定的表示,請使用 :erlang.float_to_binary/2

範例

iex> Float.to_string(7.0)
"7.0"