2011-10-20 6 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

관련 문제