Почему мое последнее деление не выполняется?
Когда OP обнаружил , d
было меньше 0,01, поэтому d >= 0.01
неверно.
Это связано с тем, что значения с плавающей запятой, такие как 0,05, являются дьяди c рациональными , не кратными степеням 10 и не точно 0,05.
Вместо этого избегайте накопленных ошибок округления с деньгами. Попробуйте использовать целое число наименьших денежных единиц, например 0,01, типа long
или long long
.
. Считать значение с плавающей запятой, масштабировать до центов и округлить.
// double d;
long d_cents;
...
do {
//d = get_float("Change owed: ");
d_cents= lround(100.0 * get_float("Change owed: "));
} while(d_cents < 0);
Масштаб по математике соответственно.
//else if (d >= 0.05) {
// coins += d / 0.05;
// d = fmod(d, 0.05);
// printf("\nd2: %f\n", d);
// printf("coins2: %d\n\n", coins);
//}
else if (d_cents >= 5) {
coins += d_cents / 5;
d_cents %= 5;
printf("\nd2: %0.2f\n", d_cents/100.0);
printf("coins2: %d\n\n", coins);
}