2016-02-18 139 views
1

我剛開始編程,寫了一個貨幣轉換器程序,需要精確到2位小數(使用雙精度)然而,我不喜歡尾隨零,但用戶應該仍然能夠輸入精度舍入小數其關閉,以一個整體整數C++貨幣轉換器尾隨零

下面是代碼:

#include <iostream> 
#include <iomanip> 

using namespace std; 

const double DOLLAR = 0.05917; 
const double EUROS = 0.05681; 

int main() 
{ 
double rand; 
double equivD; 
double equivE; 

cout << setprecision(2)<<fixed; 

cout << " Enter Rand amount: "; 
cin >> rand; 

cout << rand << " Rand(s)= "; 
equivD= (rand*DOLLAR); 
cout << equivD<< " Dollar(s)\n "; 

cout << rand << " Rand(s)= "; 
equivE= (rand*EUROS); 
cout << equivE<< " Euro(s)\n "; 

return 0; 

} 

輸出如果輸入值是一個1000:

1000.00= 57.24 Dollars 
1000.00= answer 

如果一個整數輸入不帶小數,我想刪除.00,但仍保留爲double以防萬一輸入小數。我該怎麼做呢?

+6

使用浮點數來表示貨幣通常不是一個好主意。 – unwind

回答

0

如果你想爲不同的情況下使用不同的格式,我會測試看看是否有小數。

在你的榜樣,與 S,這可能是

if(0 == (((long long)(rand*100)) % 100)) 
    cout << setprecision(0); 

這乘以100 蘭特,將其轉換爲整數類型,然後檢查是否正確的兩個數字均爲零。

更好的解決方案

使用的整體式(像INT長長)來存儲該值作爲「蘭特的百分之」(如拔示巴所建議的)。這減少了舍入誤差。爲了測試小數和輸出,只需用模,像這樣:

cout << (rand/100); // Integer division 
if(0 != (rand % 100)) // Are there any amounts less than one rand? 
    cout << '.' << (rand % 100); 

當然,還有的在用戶輸入讀取到長長這個問題,但我不是一個專家cin

+0

有沒有辦法轉動顯示點去除尾隨零? – moe7865

+0

如果我明白了,您是在詢問是否可以設置標誌來使_setprecision_設置**最大**精度而不是**常數**精度。使用_fixed_時,精度爲**常量**,並且指的是小數點右邊的數字。當使用默認的_floatfield_時,精度是**最大值**,並且指向左側**和**右側小數點的位數。總之,答案是否定的。 [C++ _fixed_ keyword](http://www.cplusplus。com/reference/ios/fixed /) –

+0

我用一個稍微不太好用的版本取代了雙打測試。 –

4

不要用浮點錢:你會在第15個有效數字;這在你花費兩位數的時候並不是特別大。

在你的情況下,使用64位整數類型並以美分爲單位,當你想顯示計算值時,調整你的格式。 (使用外匯匯率時不要忘記正確回合)。

+0

對不起,我在編程x_x時是個不錯的選擇。所以我應該在這個程序中改變什麼?也應該用什麼錢,也是我的任務規範是把它放在分錢不分美分 – moe7865

+0

@ moe7865:這裏的想法是有一個'類錢{私人:長長的美分; 「但是如果你還沒有覆蓋那些可能很困難的課程。 – MSalters