2017-06-03 28 views
0

我正在通過一門C++課程,並被要求分別製作一個帶有美元和美分變化的簡單收銀程序。我在減去cpp整數時丟失了一個數字

這樣做,我遇到了一個例子,如果我cout我的cout<<change*100 - dollars*100<<endl;的計算正確得到40美分。

但是,當我設置INT cents = change * 100 - dollars * 100;然後cout<<cents<<endl;我得到39

這是因爲我使用有一個我不知道的一些意想不到的後果中的數據類型?這裏是整個程序:

#include <iostream> 
using namespace std; 

int main() 
{ 
    double price, paymentAmount, change; 
    int dollars, cents; 

    price = 23.00; 
    paymentAmount = 24.40; 

    cout<<"total: "<<price<<endl; 
    cout<<"paid: "<<paymentAmount<<endl; 

    change = paymentAmount-price; 

    dollars = change; // implicit conversion from double -> int 
    cents = change * 100 - dollars * 100; 

    cout<<"dollars: "<<dollars<<endl; 
    cout<<"cents: "<<change*100 - dollars*100<<endl; // outputs 40 
    cout<<"cents: "<<cents<<endl; // outputs 39 

    return 0; 
} 

感謝您的幫助

編輯:

原來這是來自轉換雙爲int,其截斷小數。我的號碼是39.99999,但在轉換爲int時被截斷爲39。我認爲轉換方面使得這是一個非重複問題

+1

的[是浮點運算壞了嗎?(可能的複製https://stackoverflow.com/questions/588004/is-floating-point-math-broken驗證) –

+0

爲了將來的參考,在處理金錢時不要使用標準浮點類型和算術運算。簡單的初學者練習可能就足夠了,但一旦你成爲初學者,就不要這樣做。 –

+0

將貨幣保存爲整數/長整數的長整數,以避免信息丟失,這是由於浮點格式使用大數字或週期性分(由於1/10或1/100無法準確存儲在二進制firmat中)所造成的。 – cmdLP

回答

0

問題是change*100 - dollars*100double類型的浮點表達式。當您輸出時,這將是四捨五入的

但是,當您將其分配給整數變量時,浮點值爲截斷,其中小數點被簡單地刪除。所以,如果你有像39.9這樣的東西將舍入到40和截斷到39

+0

謝謝,我認爲這是一個更清晰的答案初學者,因爲它突出了舍入與截斷 – user2384374

0

它與decimal point precision有關。在行cents = change * 100 - dollars * 100;由於結果轉換爲int,因此精度丟失。但在cout<<"cents: "<<change*100 - dollars*100<<endl;結果是在double所以精度不會丟失。

您可以通過下面的語句

double cent2=change * 100 - dollars * 100; 
cout<<cent2<<endl;