Вычисления с плавающей запятой неточны, при математических вычислениях вы получаете очень маленькую разницу, которая нарушит вашу программу, если вы попытаетесь проверить точное равенство чисел. Например, 1.2 * 3
не совсем 3.6
(обратите внимание, что это не означает, что все вычисления неточны: например, умножение на любую степень 2
всегда точно: такие вещи, как 1.5 * 2
и 1.1 / 4
всегда дает наилучший возможный ответ). Это связано с тем, что десятичные дроби, такие как 1/10
и 1/100
, не могут быть точно представлены в двоичном формате, что является проблемой, когда наши монеты основаны на 1/100
(центах).
В вашей программе вы должны вместо этого представляйте монеты как целые числа, конвертируя все значения в центы, тогда все будет работать нормально. То есть вы знаете, что наибольший знаменатель, с которым вам когда-либо приходилось иметь дело, равен 100
, так что вы можете все умножить на 100
. Итак, nickels
будет 5
, cents
будет 1
, и все расчеты будут точными.
Чтобы избежать путаницы, вот ваш код в целых числах:
int dollars = 100, nickels = 5, cents = 1;
int amt_needed_dollars = amt_val / dollars;
amt_val -= amt_needed_dollars * dollars;
int amt_needed_nickels = amt_val / nickels;
amt_val -= amt_needed_nickels * nickels;
// skipped dividing by cents, because it's '1' anyway
int amt_needed_cents = amt_val;