浮動小数点数は実数です。小数部分を持つことがあります。コンピューターの中では、IEEE-754規格に基づいて、2進数のビットの並びとして表現されます。浮動小数点数のことは、単にfloatと呼ばれます。
浮動小数点数は常に符号付きです。符号付きとは、その数値が負かどうかを示すために、ビットの1つを確保しておくことを意味します。
浮動小数点数にはビット幅があり、これはその数値を構成するビットの数のことです。ビット幅は、その型で表現できる値の範囲と精度に影響します。
Rustには2つの浮動小数点プリミティブ型、f32とf64があります。fのあとの数字がビット幅を表します。他の言語では、f32は「単精度」、f64は「倍精度」と呼ばれることもあります。
一般的には、f64を使いましょう。最近の一般的なコンシューマー向けハードウェアではf32と同じくらい速く、しかも浮動小数点の不正確さが起きる頻度を大きく減らせます。
無限精度の有理数が必要なら、num-rationalクレートを使うとよいでしょう。これはBigRational型を提供します。固定精度の10進数が必要なら、rust_decimalクレートを使うとよいでしょう。これはDecimal型を提供します。
Rustには暗黙の数値変換がありません。浮動小数点型の間でキャストする必要がある場合、基本的な方法が2つあります。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へのasキャストは情報を失いません。逆方向は情報を失いますが、損失を最小限に抑えるために定義されたキャストの手順があります。