1

Программа должна разбивать дробь(float), на монетки 0,1 - 0,25.Число 4,84 например делит нормально, а вот у числа 3,81 оставляет осадок в виде 0.01.

#include <stdio.h>
#include <cs50.h>
int main (void) {
    int used_coins = 0;
    float coin;
    float money = get_float("how many?:");
    float coins[4] = {0.25, 0.10, 0.05, 0.01};
   for (int i = 0; i < 4;) {
       coin = coins[i];
       while (money - coin >= 0.000000) {
           used_coins++;
           money = money - coin;
       }
       printf("used\n");
       printf("%d\n", used_coins);
       printf("%f\n", coin);
       used_coins = 0;
       if (money == 0) {
           break;
       }
       i++;
   }
   printf("%f", money);

}

Вот скриншот с 3,81 введите сюда описание изображения

А вот и 4,84 введите сюда описание изображения

Colly
  • 13

2 Answers2

6

Хранение чисел с плавающей точкой грубо можно представить как хранение суммы дробей вида 1/2n. Понятно, что только редкие числа будут представлены точно. Ваше 4.84 на самом деле будет представлено как 4.84000015258789..., 3.81 - как 3.8099999427795410..., 0.1 - 0.1000000014901161..., и только 0.25 - как 0.25, потому что это - 1/4.

Поэтому, если вам нужна точная работа с суммами - превращайте их в копейки и работайте как с целыми числами. Вариант заниматься округлением результатов - сложный и требующий очень большой аккуратности и учета всех возможных неприятностей...

Harry
  • 221,325
2

Деньги нельзя хранить в виде числа с плавающей запятой, т.к. в этом случае нельзя выделить значимые разряды. Если в языке программирования нет типов данных с фиксированной запятой, можно выйти из положения и хранить деньги в виде целого числа, подразумевая копейки (иногда доли копеек).

(https://habr.com/post/112953/)

Очень хорошая статья - прочитайте!

Sergey
  • 13,474