2016-07-05 58 views
0

我已經寫了一個C++程序(應該是貨幣櫃檯),我在代碼中遇到了一些麻煩,我需要顯示小數。如果有問題,我使用cout而不是printf小數點不在C++中的貨幣櫃檯中顯示

#include <iostream> 
#include <string> 
#include <cmath> 

using namespace std; 

int main() { 
    // Strings and Integers 
    int dollars; 
    int pennies; 
    int nickles; 
    int quarters; 
    int halfDollars; 
    int dimes; 
    int fiveBill; 
    int tenBill; 
    int twentyBill; 
    int fiftyBill; 
    int hundredBill; 

    // Coin/Bill Amounts 
    int penny = 0.01; 
    int dollar = 1.00; 
    int nickle = 0.05; 
    int quarter = 0.25; 
    int halfDollar = 0.50; 
    int dime = 0.10; 
    int five = 5.00; 
    int ten = 10.00; 
    int twenty = 20.00; 
    int fifty = 50.00; 
    int hundred = 100.00; 

    // Enter Amount 
    cout << "Count your money!\n\n" << endl << "Hundred Dollar Bills: "; 
    cin >> hundredBill; 
    cout << "\nFifty Dollar Bills: "; 
    cin >> fiftyBill; 
    cout << "\nTwenty Dollar Bills: "; 
    cin >> twentyBill; 
    cout << "\nTen Dollar Bills: "; 
    cin >> tenBill; 
    cout << "\nFive Dollar Bills: "; 
    cin >> fiveBill; 
    cout << "\nOne Dollar Bills: "; 
    cin >> dollars; 
    cout << "\nHalf-Dollars: "; 
    cin >> halfDollars; 
    cout << "\nQuaters: "; 
    cin >> quarters; 
    cout << "\nDimes: "; 
    cin >> dimes; 
    cout << "\nNickles: "; 
    cin >> nickles; 
    cout << "\nPennies: "; 
    cin >> pennies; 

    // Add Together 
    cout << (hundred * hundredBill) + (fifty * fiftyBill) + (twenty * twentyBill) + (ten * tenBill) + (five * fiveBill) + (dollars * dollar) + (halfDollar * halfDollars) + (quarter * quarters) + (dime * dimes) + (nickle *  nickles) + (penny * pennies); 
    system("PAUSE"); 

    return 0; 
} 
+1

整數沒有小數。 – tkausl

回答

2

您的問題:

int penny = 0.01; 

penny是int,名稱是短期的 '積分值'。 0.01是雙重類型。如果爲任何形式的int(int,long int,short int,...)分配一個double(作爲literal或從另一個變量),則只分配整數部分並丟棄小數(簡單地捨棄,不捨去發生 - 無論該值與下一個更大的積分值有多接近)。

所以penny實際上只擁有0的一致好評其它變量,dollar是1,nickle再次0,...

你現在有兩個選擇。或者,您將所有數字轉換爲雙倍數,或者通過分配所有數值來做一點小技巧:

int penny = 1; 
int dollar = 100; 

這是我更喜歡的。那麼只有當談到輸出,你會做適當的格式:

printf("the value of my variable is %d.%.2d $\n", value/100, value % 100); 

編輯:

由於許多人寧願通過的std ::法院輸出和這個得到比較麻煩,一個辦法做到這一點方便將以下內容:

class Formatter 
{ 
    int value; 
    friend std::ostream& operator<<(std::ostream& s, Formatter f); 
public: 
    Formatter(int value) 
      : value(value) 
    { 
    } 
}; 
typedef Formatter F, M; 

std::ostream& operator<<(std::ostream& s, Formatter f) 
{ 
    char c = s.fill(); 
    return s << f.value/100 << '.' 
     << std::setfill('0') << std::setw(2) << f.value % 100 
     << std::setfill(c); // restore previous fill character! 
} 

類型定義是沒有必要的,當然,只是爲了說明其他的名字–選擇看起來最適合你(F的任何一個:格式化,M:金錢,d:美元.. )。用法則:

std::cout << F(penny) << std::endl; 
+0

智能解決方案實際上,除了流可能會導致進一步輸出錯誤。 –

+1

@PaulStelian感謝提示 - 雖然setw的效果被下一個運算符<<(請參閱[這裏](http://en.cppreference.com/w/cpp/io/manip/setw))重置,但是我監督那些setfill的不是......編輯得當。 – Aconcagua

0

我,而不是使用的 「printf」 如果該事項 「COUT」。

不,它不會影響你所期望的任何輸出。

使用您想要操作w.r.t的所有變量。小數爲'double'數據類型。

+2

'printf'在很多情況下會導致很多麻煩,比較''%.2d',value'到'<< setw(2)<< setfill('0')<< value'。這可能是它在C++中仍然活着(並且非常活躍)的原因。另一方面,如果你使用的typedef不知道確切的類型 - 或者後者可能會改變,那麼cout就有很大的優勢... – Aconcagua

+0

@Aconcagua完全同意! –

1

如前所述,問題在於您試圖將一個十進制值分配給整數變量。

什麼發生,是您的輸入(在十進制值的情況下)可以被編譯器解釋爲doublefloat-類型的變量。然而,在給定輸入的分配期間,int或者完全是一個整數,只能保存一個沒有小數分量的值。編譯器注意到這一點,並簡單地將給定的輸入縮小爲變量可容納的值。編譯器對小數點後的任何內容都不感興趣,並簡單地丟棄其餘部分。

因此,

int a = 3.5 // int can't hold the decimal 0.5, narrows into 3 
int b = 3 // int can hold this, no narrowing 
double d = 3.5 // double can hold this, no narrowing 
float f = 3.5 // float can hold this, no narrowing 

的一個好方法是與類型double,以取代所有的整型變量。在這個簡單的程序中,您不需要使用printf來格式化輸入。

而在這種情況下,您想知道爲什麼要使用double而不是float

下面是一些額外的信息:

https://softwareengineering.stackexchange.com/questions/188721/when-do-you-use-float-and-when-do-you-use-double

Should I use double or float?

+0

雖然我也提出使用double作爲一個可選項,但也存在一些缺點:浮點算法更昂貴,存在舍入問題,相等比較必須以abs(差異) Aconcagua

+0

事實確實如此,我完全同意你的看法。不過,我相信在這樣簡單的程序的情況下,我們不應該考慮浮點運算的性能問題。 – Mithraell

+0

當然,績效只是一個副作用,不應該被考慮作出決定。但你可能會喜歡這個:'雙分= 0.01;雙鎳= 0.05; std :: cout <<(2 * penny + 3 * penny == nickle)<< std :: endl;'。在這樣簡單的程序中,我寧願能夠使用運算符== ... – Aconcagua

1

如果你想保留整數,把結果爲float或double。然後將精度設置爲2位數和固定格式。

#include <iostream> 
#include <iomanip> 

... 

float total = (float) ((hundred * hundredBill) + (fifty * fiftyBill) + (twenty * twentyBill) + (ten * tenBill) + (five * fiveBill) + (dollars * dollar) + (halfDollar * halfDollars) + (quarter * quarters) + (dime * dimes) + (nickle * nickles) + (penny * pennies)); 
cout << std::setprecision(2) << std::fixed << total << endl; 
+1

格式化(精確度,固定)的好提示。這就是迄今爲止缺乏的其他「浮點」答案...... – Aconcagua