2015-06-25 2 views
-4

Я работаю над программой, которая будет конвертировать из долларов в центы. Я беру ввод пользователя как float с помощью предопределенной функции, тогда я пытаюсь умножить этот float на 100, но это дает мне неправильное значение. Heres код:Поплавок не преобразуется правильно

printf("Change in dollars: "); 
change= GetFloat(); 
cents= round(change*100); 
printf("Cents is %f",cents); 

Это логическая ошибка, так как программа работает нормально, но есть что-то не так с математикой, например, если я вхожу 1.50 при запросе, возвращение я получаю 1004, который явно не так. То, что я хочу, - это 150, которые будут выводиться.

+8

Пожалуйста, покажите 'GetFloat()'. _ и иногда остерегайтесь математики с плавающей запятой. :-) –

+0

Каковы настройки локали в ваших os? –

+0

Да, пожалуйста, отредактируйте свой вопрос и добавьте функцию GetFloat() – Noober

ответ

2

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

+0

, как бы это реализовать в моем коде – student1999

+0

@ student1999 Я не знаю, потому что вы не публиковали свои код. –

+0

благодарит за помощь! – student1999