0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

doubleをintにキャストするとちょっと小さくなる

Posted at

元のデータが整数で、それを割ったり掛けたりする時に計算精度を保つために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小さくなる」という現象になって現れます。

学術系計算とかビット系演算するときはしれっと見落として長い時間首をかしげることになるので注意しましょう。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?