2014-09-29 14 views
0

Это простая проблема расчета минимального количества монет, необходимых для внесения изменения, с учетом значения N. Разделение 0.04/0.01 дает 3, почему?Отдел дает неправильный ответ

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

int MinQtdCoins(float N, float coins[], int qtdCoins) 
{ 
    int i, qtdMinCoins = 0; 
    int numCoins=0; 
    for(i=0; i<qtdCoins; i++) 
    { 
     if(N > coins[i] || fabs(N - coins[i]) < 0.0000000001) // N >= coins[i] 
     { 
      numCoins = (int)(N/coins[i]); 
      printf("Number of Coins: %f divided by %f = %d, ",N,coins[i],numCoins); 
      qtdMinCoins += numCoins; 
      N = N - numCoins*coins[i]; 
      printf("remains: %f\n",N); 

     } 
    } 
    return qtdMinCoins; 
} 

int main() 
{ 
    int qtdCoins = 5; 
    float coins[] = {0.50, 0.25, 0.10, 0.05, 0.01}; 
    float N=9.79; 

    printf("\n\n%d\n",MinQtdCoins(N, coins, qtdCoins)); 
    return 0; 
} 
+0

В догадке я бы сказал, что вы выполняете деление с плавающей запятой, которая дает ответ близко к, но меньше 4, и усекает его до целого числа, чтобы получить 3. Попробуйте умножить вашу цель и значения ваших монет на 100, чтобы весь расчет можно было сделать целыми числами – 2014-09-29 02:35:54

+0

Связанный, если не дублировать: http://stackoverflow.com/questions/24665459/best-practices-for-floating-point-arithmetics –

ответ

5

Деление 0.04/0.01 дает 3, почему?

numCoins = (int)(N/coins[i]); 

Кастинг для int просто отсекает дробную часть. Поэтому, если 0.04/0.01 == 3.999.. (из-за округления), результат 3.

+0

Каков наилучший способ его решения? –

+0

Не использовать целое число? –

+1

@MartinJames: Нет, не используйте плавающие точки для представления денег. Используйте целые числа центов. –

0

вы делаете с плавающей точкой разделения и сохранением значения в целом ... из-за это значение сокращается до 3

Смежные вопросы