2016-09-24 4 views
2

지금은 C를 사용하고 있는데 특정 작업을 수행하는 동안 문제가 발생했습니다. 작업은 숫자를 입력 할 수 있고 사용 된 동전의 값이 표시됩니다. 내 문제는 0.10 센트의 가치가 있다고 말하면서, 제 코드는 10 센트의 값이 변화의 값보다 작은지를 확인한 후, 니켈을 계속해서 읽습니다. 변경 값이 0.05로 변경된 후 니켈을 건너 뛰고 페니로 간 다음 0.01으로 멈추고 동전 수를 끝내면 페니가 짧아지고 필요 이상으로 길어집니다.float 값이 동일 할 때 for 루프를 계속 실행하려면 어떻게해야합니까?

int main(void) { 
    float c; 

    int k = 0; 

    printf("How much change?: \n"); 
    c = GetFloat(); 

    //checks for quarters 
    for (float q = 0.25; q <= c; k = k + 1) { 

    c = c - 0.25; 
    printf("q \n"); 
    } 
    //checks for dimes 
    for (float d = 0.10; d <= c; k = k + 1) { 

    c = c - 0.10; 
    printf("d \n"); 
    } 
    //checks for nickels 
    for (float n = 0.05; n <= c; k = k + 1) { 
    c = c - 0.05; 
    printf("n \n"); 

    } 
    //checks for pennies 
    for (float p = 0.01; p <= c; k = k + 1) { 
    c = c - 0.01; 
    printf("p \n"); 
    } 

    printf("%d & %.02f \n", k, c); 
} 

나는 오류가 for 루프의 조건 부분이 될 수 있다고 생각 단서가 있지만 단서가 없다 :/

+1

[부동 소수점 연산이 깨졌습니까?] (http://stackoverflow.com/questions/588004/is-floating-point-math-broken) – Olaf

+0

사람들이 정보 페이지를 단지 읽을 수만 있다면 ** 전에 * * asking ... – Olaf

+0

모든 C 기반 언어에서 이와 비슷한가요? (C++, C#, java) – shinzou

답변

6

귀하의 문제가 모든 점 부정확 부동으로 인해 : 이진 부동 포인트가 없습니다 10 진법 표기법으로 정확하게 변환됩니다.

0.25는 부동 소수점으로 정확하게 표현할 수 있습니다. 그러나 0.1은 할 수 없습니다. 따라서이 금액만큼 증가하면 예기치 않은 동작이 발생합니다.

이 경우 전체 유형을 사용하고 센트로 작업하는 것이 가장 좋습니다.

관련 문제