質問です。

入力された数字が整数か実数で条件分岐したいと思っています。

double d;
cin >> d;
int i=(int)d;
double EPS=0.001;
if( abs(i-d)<EPS ){
 //i を使用して処理
} else {
 //d を使用して処理
}

cinから整数値を入力した場合
『double型に格納された整数は内部で正しく表現されないため、
これをint型にキャストすると、値が入力値より誤って1減るに違いない』
と推測していたのですが、i には入力値が1減らずに入りました。

入力値は1~9999までの整数値を試しましたが、どれも入力値と同じ値が i に格納されました。
推測が外れて不気味です。
なぜ入力値と同じ値が i に格納されるのか、教えていただけませんか?