我写了一个C ++程序(应该是货币计数器),我的代码遇到了一些问题,我需要显示小数。如果重要的话,我会使用cout
代替printf
。
#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;
}
答案 0 :(得分:2)
你的问题:
int penny = 0.01;
penny
是一个int,名称是'integral value'的缩写。 0.01是double类型。如果将double(从文字或从另一个变量)分配给任何形式的int(int,long int,short int,...),则只分配整数部分并删除小数(简单地删除,不进行舍入)发生 - 无论该值与下一个更大的整数值有多接近)。
所以penny
实际上只保留0.其他变量相似,dollar
为1,nickle
再次为0,...
您现在有两个选择。或者,您将所有数字转换为double,或者通过以分数分配所有值来做一个小技巧:
int penny = 1;
int dollar = 100;
这是我更喜欢的。然后,只有在输出时才会进行适当的格式化:
printf("the value of my variable is %d.%.2d $\n", value / 100, value % 100);
修改强>
由于许多人更喜欢通过std :: cout输出,而这很麻烦,一种方便的方法是:
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!
}
当然,Typedef不是必需的,只是为了说明其他名称 - 选择一个看起来最适合你的名字(F:Formatter,M:Money,D:Dollar,...)。用法:
std::cout << F(penny) << std::endl;
答案 1 :(得分:1)
如上所述,问题在于您尝试将十进制值分配给整数变量。
发生的是,您的输入(在十进制值的情况下)可以被编译器解释为double
或float
类型的变量。然而,在给定输入的赋值期间,int
或完全,整数,只能保持没有小数分量的值。编译器会注意到这一点,只需将给定的输入缩小为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
。
以下是一些其他信息:
答案 2 :(得分: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;
答案 3 :(得分:0)
我用&#34; cout&#34;而不是&#34; printf&#34;如果重要的话。
不管你想要什么输出都没关系。
使用您想要操作的所有变量w.r.t.小数点为&#39; double&#39;数据类型。