Фаренгейт к Цельсию неверный результат

Я изучаю разработку программного обеспечения, и мне нужно преобразовать Фаренгейт в Цельсий, но мой код вычисляет его неправильно. Вот мой код:

int main() {
    // configure the out put to display money
    cout.setf(ios::fixed);     //no scientific notation
    cout.setf(ios::showpoint); //show decimal point
    cout.precision(0);         //two decimal for cents

    int fahrenheit = 0 ;
    int celsius = 5/9*(fahrenheit-32);

    cout << "Please enter Fahrenheit degrees:  ";
    cin >> fahrenheit ;

    cout << "Celsius:  " <<  celsius << endl;

   return 0;
}

3 ответа

Ваша формула использует int: 5/9, что означает, что вы теряете некоторую точность, измените 5 на 5.0 или, если вы хотите, чтобы Celsius плавал

В вашем коде четыре ошибки.

1) Главное - осознать, что компьютер делает все в том порядке, в котором вы его просите. Очевидно, правильный порядок: а) попросить пользователя ввести температуру; б) преобразовать ее в градусы Цельсия. Но ваш код делает это наоборот. Вот ваш код с некоторыми моими комментариями

// convert fahrenheit to celcius
int celsius = 5/9*(fahrenheit-32);

// ask user to enter fahrenheit temperature
cout << "Please enter Fahrenheit degrees:  ";
cin >> fahrenheit ;

Надеюсь, теперь очевидно, что у вас все неправильно

2) Вторая ошибка в том, что вы выбрали неверный тип для ваших переменных. Температура не является целым числом (например, нет ничего плохого в том, что температура составляет 80,5 градусов). Таким образом, вы должны выбрать тип с плавающей запятой для ваших переменных, float это одна возможность.

3) Третья ошибка довольно техническая, но важная для понимания. В вашем уравнении вы написали 5/9, и то и другое 5 а также 9 являются целыми числами, поэтому компьютер будет выполнять целочисленное деление, что означает, что при любом математическом результате деления компьютер отбрасывает дробную часть результата, оставляя целое число. Так математически 5/9 является 0.555555..., отбрасывая дробную часть листьев 0 так что ваше уравнение такое же, как 0*(fahrenheit-32) что явно не даст правильного результата. использование 5.0/9.0 вместо 5/9 Таким образом, вы получите деление с плавающей запятой.

4) Окончательная ошибка довольно тривиальна

cout.precision(0);         //two decimal for cents

Если вы хотите два знака после запятой, это должно быть

cout.precision(2);

Наконец, это не ошибка, но комментарии о деньгах неуместны в программе о температуре.

Вот версия вашего кода с исправленными ошибками

int main() {
    cout.setf(ios::fixed);     //no scientific notation
    cout.setf(ios::showpoint); //show decimal point
    cout.precision(2);         //two decimal places


    float fahrenheit;
    cout << "Please enter Fahrenheit degrees:  ";
    cin >> fahrenheit;

    float celsius = 5.0/9.0*(fahrenheit-32.0);
    cout << "Celsius:  " <<  celsius << endl;

   return 0;
}

Я уверен, что вы удивлены тем, что в короткой программе может быть так много ошибок. Это просто подчеркивает, что вы должны быть осторожны и точны при написании кода.

Если вам нужно использовать int, то вы должны выполнить деление как последний шаг, чтобы уменьшить потерю точности для int-типов. Но имейте в виду, что это может привести к переполнению (не должно быть проблемой для температур...)

#include <iostream>
using namespace std;
int main() {
    // configure the out put to display money
    cout.setf(ios::fixed);     //no scientific notation
    cout.setf(ios::showpoint); //show decimal point
    cout.precision(0);         //two decimal for cents

    int fahrenheit = 0 ;

    cout << "Please enter Fahrenheit degrees:  ";
    cin >> fahrenheit ;
    int celsius = 5*(fahrenheit-32)/9;
    cout << "Celsius:  " <<  celsius << endl;

   return 0;
}
Другие вопросы по тегам