Float не конвертируется правильно
Я работаю над программой, которая будет конвертировать из долларов в центы. Я принимаю пользовательский ввод в виде числа с плавающей запятой, используя предопределенную функцию, затем пытаюсь умножить это число на 100, но это дает мне неправильное значение. Вот код:
printf("Change in dollars: ");
change= GetFloat();
cents= round(change*100);
printf("Cents is %f",cents);
Это логическая ошибка, потому что программа работает нормально, но с математикой что-то не так, например, если я при появлении запроса ввожу 1.50, возвращаемое значение равно 1004, что явно неверно. То, что я хочу, это 150, которые будут выведены.
1 ответ
Это, скорее всего, потому что у вас есть локаль, где десятичный разделитель ,
вместо .
и, поскольку вы, скорее всего, не проверяете возвращаемое значение scanf()
"это то, что делают большинство книг и почти каждый учебник", тогда переменная не инициализируется, и то, что вы печатаете, является следствием компоновки вашей программы, а не значением, введенным пользователем.
Чтобы проверить, что я говорю, я предлагаю собрать ту же программу без изменений, но с разными флагами компиляции.
Что вы должны сделать, это убедиться, что ввод правильный, попробуйте это
float GetFloat(int *ok)
{
float value = 0;
if (scanf("%f", &value) != 1)
*ok = 0;
else
*ok = 1;
return value;
}
который вы бы назвали так
int result = 0;
float change = GetFloat(&result);
if (result == 0)
return -1;
float cents = round(change * 100);
printf("Cents is %f",cents);
Если десятичный разделитель является проблемой, вышеуказанная программа не будет ничего выводить, потому что scanf()
вернусь 0
, и поэтому ok
будет 0
после вызова функции.
Одним из важных следствий игнорирования возвращаемого значенияvoid
функции в том, что если значение не было инициализировано, как в этом случае с scanf()
и вы не знаете, что из-за того, что вы не проверяли возвращаемое значение, произойдет неопределенное поведение, означающее, что ваша программа будет содержать ошибки, которые очень трудно найти и, следовательно, очень трудно исправить.