Причина, по которой вы видите 22
вместо 18
для ввода 4.20
, заключается в неточности с плавающей запятой. Число с плавающей запятой не может точно представлять значение 4.20
, поэтому оно будет хранить значение немного больше или чуть меньше, чем 4.20
в вашей переменной.
В случае, если используется немного меньшее значение (например, 4.1999999 или 4.19998567), при умножении этого значения на 100 вы получите что-то близкое к 419.99999. Превращение этого в int
усечет это до 419 и даст вам результат в 22 монеты.
Решение состоит в том, чтобы округлять до ближайшего целого, а не усекать, превращая числа с плавающей точкой в целые числа. Обычный прием, который работает для небольших чисел с плавающей запятой, заключается в добавлении 0,5 перед усечением:
change = user * 100 + 0.5;
Значения в диапазоне от 419.5000 до 420.4999 будут преобразованы в значения в диапазоне от 420.0000 до 420.99999. И усечение тогда даст 420.
Естественно, вы также можете использовать встроенные функции округления, которые поставляются с c
.
Вам также следует рассмотреть возможность использования double
вместо float
. Пространство, сэкономленное с помощью float
, обычно не стоит в современных настольных системах.