Code Fix

初級

整数同士の割り算 / が小数にならず切り捨てられる

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 / peopletotal as f64 / people as f64 にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  fn main() {
 2      let minutes = 100;
 3      let hours = 60;
 4      println!("{}", minutes / hours              );
                                     ^
 5  }
出力: 1

割り切れない整数の割り算は、小数点以下が切り捨てられたまま整数として返ってきます。

直し方: minutes / hoursminutes 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 / countprice 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 / speeddistance as f64 / speed as f64 にします。

この問題を解いてみる →

パターン5

 1  fn main() {
 2      let budget = 340;
 3      let members = 6;
 4      println!("{}", budget / members              );
                                      ^
 5  }
出力: 56

整数の割り算はエラーにならないため、結果を見て初めて誤りに気づくことになります。

直し方: budget / membersbudget as f64 / members as f64 にします。

この問題を解いてみる →

よくある誤解

「割り算だから結果は自動的に小数になるはず」という思い込みは誤りです。小数の結果が欲しい場合は、片方をas f64で浮動小数点数に変換してから割る必要があります。

まとめ

整数同士の割り算 / が小数にならず切り捨てられるは初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)