浮點數屬於實數:它們可以帶有小數部分。在機器中,浮點數是以 IEEE-754 規範 所定義的二元位元模式來表示。大家通常直接以 float 來稱呼浮點數。
浮點數一律帶有正負號。帶正負號的意思是,保留這個數的其中一個位元,用來指出它是不是負數。
浮點數有位元寬度,也就是組成這個數的位元數。這會影響該型別能表示的數值範圍與精度。
Rust 有 2 種浮點數基本型別:f32和f64。f後面的數字代表位元寬度。在其他語言裡,f32有時稱為「單精度」,f64有時稱為「雙精度」。
一般而言,請用f64:在大多數現代消費級硬體上,它和f32一樣快,而且能大幅降低浮點數不精確的情形。
如果你需要無限精度的有理數,可以使用 num-rational crate,它提供了BigRational型別。如果你需要固定精度的十進位數,可以使用 rust_decimal crate,它提供了Decimal型別。
Rust 沒有隱式數值轉換。如果你需要在浮點型別之間轉型,有兩種基本做法:as關鍵字,以及From和TryFrom特徵。
使用as關鍵字很簡單:expr as Type。不過,使用as轉型時,有許多注意事項與細節需要留意。
以特徵為基礎的轉型稍微複雜一些,但更安全:轉換特徵只在安全的地方才有實作。舉例來說,f32 實作了From<u8>、From<u16>、From<i8>和From<i16>:任何能用這些型別表示的數值,都保證能以f32表示。用法可以是f32::from(expr),或是expr.into(),其中expr會解析成上述其中一種型別。
轉換浮點數值時,as轉型通常比較受青睞,原因很單純:以特徵為基礎的轉型實作相對稀少。截至 2020 年 10 月,浮點數尚未實作TryFrom。從f32轉型為f64是無損的。反過來則是有損的,但有定義明確的轉型協定,用來盡量減少損失。