непреднамеренное округление двойной переменной c ++ - PullRequest
0 голосов
/ 02 мая 2020

Проблема в основном: всегда округляется до 0.x, а ответ неправильный

Я использую код: blocks mingw

Пожалуйста, посмотрите на это изображение в транзакции 2, это 99855,7-145,022, но ответ уже округлен

enter image description here

#include <iostream>
using namespace std;

int main()
{
    double x,amort,principalminus,interest,amortbal,theo,adv,advtemp,paid,mri;
    double principal;
    char con;
    adv=0;
    cout<<"CMP Calculator "<<endl;
    cout<<"Base Principal:";
    cin>>principal;
    cout<<"MRI:";
    cin>>mri;
    cout<<"Monthly Amortization:";
    cin>>amort;
    do
    {
      x++;
      interest = (principal*0.06)/12;
      cout<<"Number of transaction:"<<x<<endl;
      cout<<"Amortization amount paid:";
      cin>>paid;
      if(paid>=685.3)
      {
        principalminus = amort - (interest+mri);
        advtemp = paid-amort;
      }
      principal=principal-principalminus;
      adv=adv+advtemp;
      cout<<"Interest:"<<interest<<endl;
      cout<<"Principal Paid:"<<principalminus<<endl;
      cout<<"Advance:"<<adv<<endl;
      cout<<"Total Principal:"<<principal<<endl;

      cout<<"Do you want to continue?:[Y/N]";
      cin>>con;
      cout<<endl<<endl;
    }
    while(con=='Y'||con=='y');

    return 0;
}

1 Ответ

0 голосов
/ 02 мая 2020

это 99855.7-145.022, но ответ уже округлен

вам просто нужно напечатать больше цифр, например, выполните:

cout << std::setprecision(15);

где-то раньше другой отпечаток, для этого вам нужно

#include <iomanip>  

, и у вас будет

pi@raspberrypi:/tmp $ ./a.out
CMP Calculator 
Base Principal:100000
MRI:41
Monthly Amortization:685.3
Number of transaction:1
Amortization amount paid:686
Interest:500
Principal Paid:144.3
Advance:0.700000000000045
Total Principal:99855.7
Do you want to continue?:[Y/N]y


Number of transaction:2
Amortization amount paid:686
Interest:499.2785
Principal Paid:145.0215
Advance:1.40000000000009
Total Principal:99710.6785
Do you want to continue?:[Y/N]n

Напечатанное значение Total Principal является правильным, в любом случае, понять В определении есть предел точности любых чисел с плавающей запятой, и вы можете увидеть это в напечатанных значениях для Advance .

Если ваш компилятор поддерживает long double, вы можете использовать их, также спрашивая для печати 20 цифр результат будет:

bruno@bruno-XPS-8300: / tmp $ ./a.out

CMP Calculator 
Base Principal:100000
MRI:41
Monthly Amortization:685.3
Number of transaction:1
Amortization amount paid:686
Interest:499.99999999999998149
Principal Paid:144.30000000000001853
Advance:0.7000000000000000111
Total Principal:99855.699999999999982
Do you want to continue?:[Y/N]y


Number of transaction:2
Amortization amount paid:686
Interest:499.27849999999998143
Principal Paid:145.02150000000001856
Advance:1.4000000000000000222
Total Principal:99710.678499999999964
Do you want to continue?:[Y/N]n

Обратите внимание, что вы пропустили инициализацию x с 0, и это может быть int, а не double

...