С следующей простой C++ упражненияНемного разные ответы при изменении ассоциативность
#include <iostream>
using namespace std;
int main()
{
int euro, cents_v1, cents_v2, do_again;
double price;
do_again = 1;
while(do_again != 0){
cout<<"Insert price in Euro with cents"<<endl;
cin>>price;
euro = price;
cents_v1 = price*100 - euro*100;
cents_v2 = (price - euro) * 100;
cout<<"Total: "<<euro<<" euro and "<<cents_v1<<" cents"<< endl;
cout<<"Total: "<<euro<<" euro and "<<cents_v2<<" cents"<< endl;
cout <<"\nDo it again? 1: yes, 0: no."<<endl;
cin>>do_again;
}
return 0;
}
Вы можете получить два разных ответа, если вход, например, 31.13:
Insert price in Euro with cents
31.13
Total: 31 euro and 13 cents
Total: 31 euro and 12 cents
Do it again? 1: yes, 0: no.
Как бороться с этим проблема? Есть ли правило в программировании, чтобы избежать или контролировать эту проблему в более сложных ситуациях?
Стандартный ответ на этот вопрос [Что должен знать каждый компьютерный ученый о плавающей запятой] (https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) –
Преобразование результатов FP в целые числа могут сильно пострадать из-за усечения. Предложите округление. 'cents_v1 = round (цена * 100 - евро * 100);' – chux