Lasička Ответов: 3

Почему этот код игнорирует значение 0.10 и 0.01 в массиве.


Это ядро из моего задания на самостоятельную проверку, и мне интересно, почему оно не работает должным образом. Он игнорирует значения 0.10 и 0.01, и я не знаю почему. Пожалуйста, помогите мне.


int main()
{
float howMuch;
float payment;
float money[13] = {100, 50, 20, 10, 5, 2, 1, 0.50, 0.20, 0.10, 0.05, 0.02, 0.01};
scanf("%f", &howMuch);
while(howMuch > 0 )
{
    scanf("%f", &payment);
    howMuch -= payment;
}
howMuch = -1*howMuch;
for(int i = 0; i < 13; i++)
{
    while(money[i] <= howMuch)
    {
        howMuch -= money[i];
        printf("%.2f ", money[i]);
    }
}
printf("\n");
return 0;
}


Что я уже пробовал:

Ничего, я просто думаю, что это должно сработать.

3 Ответов

Рейтинг:
2

Lasička

например, если howMuch равен 0.90, а платеж равен 100, он возвращается 50 20 20 5 2 2 0.05 0.02 0.02 ... не 50 20 20 5 2 2 0.10


Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.
и удалите решение.

Рейтинг:
1

CPallini

Это проблема округления (см. Что Каждый Компьютерщик Должен Знать Об Арифметике С Плавающей Запятой[^]). Попробуйте бежать

#include <stdio.h>
int main()
{
float howMuch;
float payment;
float money[13] = {100, 50, 20, 10, 5, 2, 1, 0.50, 0.20, 0.10, 0.05, 0.02, 0.01};
scanf("%f", &howMuch);
while(howMuch > 0 )
{
    scanf("%f", &payment);
    howMuch -= payment;
}
howMuch = -1*howMuch;

printf("howMuch = %f\n", howMuch);
for(int i = 0; i < 13; i++)
{
    while(money[i] <= howMuch)
    {
        howMuch -= money[i];
        printf("money %.2f (howMuch %f)\n", money[i], howMuch);
    }
}
printf("\n");
return 0;
}

С howMuch = .9 и payment = 100 Он выводит наружу:
howMuch = 99.099998
money 50.00 (howMuch 49.099998)
money 20.00 (howMuch 29.099998)
money 20.00 (howMuch 9.099998)
money 5.00 (howMuch 4.099998)
money 2.00 (howMuch 2.099998)
money 2.00 (howMuch 0.099998)
money 0.05 (howMuch 0.049998)
money 0.02 (howMuch 0.029998)
money 0.02 (howMuch 0.009998)

Я предлагаю вам использовать intс (с cent детализация, например 150 будет означать 1.50) вместо floatс.


Рейтинг:
1

Patrice T

Цитата:
Почему этот код игнорирует значение 0.10 и 0.01 в массиве.

Потому что вы используете поплавки!
Поплавки не являются точными значениями.
Если вы говорите, что работаете в центах, вы можете переключиться на целые числа.
Некоторые языки имеют currency тип данных-это масштабируемое целое число.