Фаренгейт к Цельсию неверный результат
Я изучаю разработку программного обеспечения, и мне нужно преобразовать Фаренгейт в Цельсий, но мой код вычисляет его неправильно. Вот мой код:
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;
}