C ++中货币计数器中没有显示的小数

时间:2016-07-05 05:41:19

标签: c++

我写了一个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;
}

4 个答案:

答案 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)

如上所述,问题在于您尝试将十进制值分配给整数变量。

发生的是,您的输入(在十进制值的情况下)可以被编译器解释为doublefloat类型的变量。然而,在给定输入的赋值期间,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

以下是一些其他信息:

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

Should I use double or 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;数据类型。