CS50 Жадные советы

Я делаю задание cs50 «Жадный». В основном спрашивает у пользователя, сколько изменений должно быть получено, а затем выдает минимальное количество монет, которое может равняться введенной сумме. Он работает отлично, за исключением случаев, когда я вхожу в 4.2, он выводит 22, когда он должен выводить 18.

#include  #include  int main(void) { float n; do { n = get_float("How much change is owed?\n"); } while(n == EOF); int cents = (int)(n * 100); int minimumamountofcoins = 0; if (cents/25 >= 1){ while (cents/25 >= 1) { cents -= 25; minimumamountofcoins++; } } if (cents/10 >= 1){ while (cents/10 >= 1) { cents -= 10; minimumamountofcoins++; } } if(cents/5 >= 1){ while (cents/5 >= 1) { cents -= 5; minimumamountofcoins++; } } if (cents/1 >= 1){ while (cents/1 >= 1) { cents -= 1; minimumamountofcoins++; } } printf("The minimum amount of coins is %d\n", minimumamountofcoins); } 

Похоже, что это проблема с преобразованием из float в int. Когда вы пытаетесь конвертировать из доллара в центы, вы делаете это с помощью этой строки кода:

 int cents = (int)(n * 100); 

Тем не менее, эта строка кода для $ 4.20 возвращает значение центра 419. Это проблема с округлением и поплавками, так как 4.2 * 100 возвращает 419.99999999 вместо 420.0000000, а целое число обрезает вместо округления. Эта проблема также возникает с $ 4.18 и, возможно, другими значениями.

Чтобы этого не произошло, добавьте 0.5 перед броском, например:

 int cents = (int)(n * 100 + 0.5); 

Это гарантирует, что округление происходит в правильном направлении, так как вы никогда не отключаетесь от тривиальной ошибки с плавающей точкой.

Используя библиотеку math.h , вы также можете использовать roundf() , которая будет работать в случае отрицательных чисел на всякий случай.

 int cents = (int)(roundf(n*100));