整数同士の割り算 / が小数にならず切り捨てられる
i32同士の/演算子は、商の整数部分だけを返します。小数点以下は切り捨てられ、割り切れなくても整数のままです。
なぜエラーが出ないのか
出力: 3
(エラーなし)- Rustは何も報告しません。型としても借用としても正しいコードだからです
出力: 3- 実際の出力 — 期待した結果と食い違っている箇所
見つけ方- エラーが出ないので、出力を目で確かめるしかありません。この種の誤りが最も発見が遅れます
このエラーが出る典型パターン
パターン1
1 fn main() { 2 let total = 7; 3 let people = 2; 4 println!("{}", total / people ); ^ 5 }
出力: 3
i32同士の/は商の整数部分だけを返します。小数の結果が欲しい場合はasでf64に変換してから割ります。
直し方: total / people を total as f64 / people as f64 にします。
広告
広告スロット(未設定)
パターン2
1 fn main() { 2 let minutes = 100; 3 let hours = 60; 4 println!("{}", minutes / hours ); ^ 5 }
出力: 1
割り切れない整数の割り算は、小数点以下が切り捨てられたまま整数として返ってきます。
直し方: minutes / hours を minutes as f64 / hours as f64 にします。
パターン3
1 fn main() { 2 let price = 500; 3 let count = 3; 4 println!("{}", price / count ); ^ 5 }
出力: 166
1人あたりの正確な金額を求めたい場合、整数のまま割ると誤差が出てしまいます。
直し方: price / count を price as f64 / count as f64 にします。
パターン4
1 fn main() { 2 let distance = 10; 3 let speed = 3; 4 println!("{}", distance / speed ); ^ 5 }
出力: 3
所要時間の計算など、小数が意味を持つ場面では明示的にasでf64へ変換する必要があります。
直し方: distance / speed を distance as f64 / speed as f64 にします。
パターン5
1 fn main() { 2 let budget = 340; 3 let members = 6; 4 println!("{}", budget / members ); ^ 5 }
出力: 56
整数の割り算はエラーにならないため、結果を見て初めて誤りに気づくことになります。
直し方: budget / members を budget as f64 / members as f64 にします。
よくある誤解
「割り算だから結果は自動的に小数になるはず」という思い込みは誤りです。小数の結果が欲しい場合は、片方をas f64で浮動小数点数に変換してから割る必要があります。
まとめ
整数同士の割り算 / が小数にならず切り捨てられるは初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。