元のデータが整数で、それを割ったり掛けたりする時に計算精度を保つためにdoubleとかfloatにして計算結果を整数に戻すことってよくありますよね?
(私はあります)
で、その時に元の整数よりどうしても1だけ小さくなったりしませんか?
Sample.cs
int a = 10;
double b = a / 3.0;
double c = b * 3.0;
int d = (int)c; // => これ、9だったりする (概念だけのテキトーコードだからホントかどうかは知らん)
なんでか?
答えは公式ドキュメントの中にあります。
double
またはfloat
値を整数型に変換するとき、この値は 0 方向に最も近い整数値に丸められます。 結果的に生成される整数値が変換先の型の範囲外になる場合、結果はオーバーフロー チェック コンテキストによって変わります。 チェック済みコンテキストの場合、OverflowException がスローされます。未チェック コンテキストの場合、結果は変換先の型の不特定な値になります。
はい、 「0方向に最も近い整数値に丸められます」 と書いてありますね。
なので、主に正の整数だった場合は表題のように「どうしても1小さくなる」という現象になって現れます。
学術系計算とかビット系演算するときはしれっと見落として長い時間首をかしげることになるので注意しましょう。