简体   繁体   中英

c++ currency converter trailing zeroes

i just started programming and wrote a currency converter programme that needs to be accurate to 2 decimals (using double) However i would not like trailing zeroes but users should still be able to input decimals with set precision rounding it off to a whole integer

Here is the code:

#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;

}

Output if entered value is a 1000 is:

1000.00= 57.24 Dollars 
1000.00= answer

If an integer is inputed without decimals I would like to remove the .00 but still keep it as a double in case a decimal is inputed. How do I do this?

Don't use floating point for money: you'll be off on the 15th significant figure; which, by the time you've consumed two digits for the cents, is not particularly large.

In your case, use a 64 bit integral type and work in cents, tweaking your formatting when you want to display computed values. (Don't forget to round correctly when using the FX rates).

If you want different formatting for different cases, I would test to see if there is a decimal.

In your example, with double s, this could be

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

This multiplies rand by 100, converts it to an integral type, and then checks if the right two digits are both zero.

The Better Solution

Use an integral type (like int or long long ) to store the value as "hundredths of rands" (like Bathsheba suggested). This reduces rounding errors. To test for the decimal and output, just use a modulo, like this:

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

Of course, there is still the issue of reading in the user input to a long long , but I'm not an expert with cin .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM