単精度および倍精度の浮動小数点数は整数と同じ方法で格納されないため、整数 (5、10 など) は実際には長い 10 進数 (4.9999001、10.000000001 など) のように見える場合があります。にキャストするとint
、整数が切り捨てられるだけです。そのため、数値が現在 として表されている場合、4.999999999
それを にキャストするint
と が得られます4
。 std::round
ほとんどの場合、より良い結果が得られます (数値が 4.6 で、整数部分だけが必要な場合、round はうまく機能しません)。double
より大きな問題は、 aを anにキャストすることで何を達成したいのint
かということです。
一般に、浮動小数点数を扱う場合、最小有効桁数であるイプシロン値を使用する必要があります。したがって、4.9999999 を 5 と比較したい場合は、(疑似コード): を実行しますif abs(5 - 4.9999999) < epsilon, return 5
。
例
int main()
{
double d;
std::cin >> d;
while (std::fabs(d - 0.0) > DBL_EPSILON)
{
std::cout << d << std::endl;
double m = 100 * d;
int n = static_cast<int>(m);
if (std::fabs(static_cast<double>(n) - m) > DBL_EPSILON)
{
n++;
}
std::cout << n << std::endl;
std::cin >> d;
}
return 0;
}