2011-10-20 15 views
3

私はWinXPのSP3(32ビット)上で実行されている、DEVC++ 4.9を使用しています、ここでのコードは次のとおりです。Cの間違った二重計算?

テスト1:

#include <stdio.h> 
#include <stdlib.h> 

main(int argc, char *argv[]) 
{ 
    double value; 

    int i; 

    printf("Enter double: "); 
    scanf("%lf", &value); 
    i = value*100; 
    printf("double: %lf\n", value); 
    printf("int: %d\n", i); 

    system("PAUSE"); 
} 

私は結果を別の値を入力すると、ここにありきenter image description here

試験2:

enter image description here

試験3:試験1及び試験2は、異なる結果を表示なぜ

enter image description here

+1

これはフロートがどのように格納されているか、それをどのように整数として近似することができるのかという特殊な疑問です。 –

答えて

6

これは、浮動小数点四捨五入によるものである:すべてのコンピュータ科学者は、浮動小数点演算について知っておくべきこと

http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html

3.07が正確にバイナリで表現することはできません。あなたのケースでは、それゆえ100 * 3.073.05に同じ306

適用に切り捨てられ306.9999999...に評価され、わずか未満3.07に丸みを帯びています。しかし、3.06は、少し丸められています。だから100 * 3.06は正しく306として表示されます。

+0

いい説明とリンク。ありがとうございました。 – Alphaneo

関連する問題