檢視原始碼 Float (Elixir v1.16.2)
用於處理浮點數的函式。
有關浮點數的數學運算,請參閱 Erlang 的 :math
模組。
Kernel 函式
在 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.010000000000000002,而且由於這不是最接近 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,它使用 SIGPLAN '2018 程式語言設計與實作會議論文中提出的「Ryū:快速的浮點數轉字串轉換」演算法。
對於 OTP < 24,它使用 SIGPLAN '1996 程式語言設計與實作會議論文中提出的「快速且精確地列印浮點數」演算法。
對於可設定的表示,請使用 :erlang.float_to_list/2
。
範例
iex> Float.to_charlist(7.0)
'7.0'
傳回一個二進位數字,對應於給定浮點數最短的文字表示。
基礎演算法會根據 Erlang/OTP 版本而改變
對於 OTP >= 24,它使用 SIGPLAN '2018 程式語言設計與實作會議論文中提出的「Ryū:快速的浮點數轉字串轉換」演算法。
對於 OTP < 24,它使用 SIGPLAN '1996 程式語言設計與實作會議論文中提出的「快速且精確地列印浮點數」演算法。
對於可設定的表示,請使用 :erlang.float_to_binary/2
。
範例
iex> Float.to_string(7.0)
"7.0"