0

int と double を混在させると、次のプログラムで奇妙な結果が生成されます。

int main()
{
    double x = 9.90, y = 10.0, z, w;
    int    ip, fp;

    z = y - x;

    ip = (int) z;

    w = (z - ip)*100;

    printf( "\nx = %f\ty = %f\tz = %f\tw = %f\n",
            x, y, z, w );

    printf("\nip = %d", ip); /* So far, so good */

    fp = (int) w; /* Why does fp get 9 and not 10??? */

    printf("\nfp = %d\n", fp);

    return 0;
}

結果:

x = 9.900000    y = 10.000000   z = 0.100000    w = 10.000000

ip = 0
fp = 9 (Should be 10!)

結果は、MingGW (WinXP) e Clang (MacOSX) を使用しても同じです。誰かがこの奇妙な振る舞いを説明できますか?

4

2 に答える 2

0

doubleaが value を正確に保持できないため、エラーが発生します9.9。それが管理できる最も近いものは、実際には9.9000000000000003552713678800500929355621337890625. だからあなたの価値wはありません10、それは本当に9.99999999999996447286321199499070644378662109375です。

printf で使用する%fと、値が小数点以下 6 桁に丸められます。printf フォーマットを のようなものに変更する%.60fと、値の完全な精度を確認できます。

于 2013-04-02T03:34:33.880 に答える