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()и вы не знаете, что из-за того, что вы не проверяли возвращаемое значение, произойдет неопределенное поведение, означающее, что ваша программа будет содержать ошибки, которые очень трудно найти и, следовательно, очень трудно исправить.

Другие вопросы по тегам