2015-07-10 197 views
2

我刚完成我的更改计算器(根据购买成本和给定的现金计算更改)。我正在测试它,看看它是否有效,并发现一个错误。只要给出的便士数量恰好为1,就表示它为0.我浏览了代码,并手动完成了我写的代码(不运行它)的代码,它看起来应该可以工作。如果你想自己测试这个,只需将0作为购买成本,36.91作为现金。 (这意味着变化是36.91,它应该是1个20,1,1,10,1半美元,1个季度,1个硬币,1个镍和1个便士[但它表示0个便士]。 :我很新的C++和了解很少更改计算器不计算便士

这里是代码:

/*This program simulates a situation at the register where someone pays with cash 
and the cashier needs to know how much change and of which coins he or she needs to give. 
Written by Jay Schauer 
*/ 

//Data Declarations 
#include <iostream> 
#include <cstdint> 

int main() 
{ 
    using namespace std; 

    double cost; //Stores cost of purchase 
    cout << "Input cost of purchase (in USD)" << endl; 
    cin >> cost; 
    double cash; //Stores cash that pays for purchase 
    cout << "Input cash given (in USD)" << endl; 
    cin >> cash; 
    double changet = cash - cost; //Stores the change, 
    the t is for temporaary because I use a different change variable later 
    cout << "Change to be given is " << changet << " in..." << endl; 

    //Also, I thought this was pretty clever since doubles apparantly can't be used 
    //with modulus (it gave me an error), 
    //so I figured I just multiply it by 100 and multiply all the divisions by 100 also 

    changet *= 100; 
    int change = changet; //Converts changet to an integer to be used with the modulus 
    int coins; //Stores the amount of "coins" to be given as change 

    coins = change/2000; 
    cout << coins << " twenty dollar bills" << endl; 
    change = change % 2000; 

    coins = change/1000; 
    cout << coins << " ten dollar bills" << endl; 
    change = change % 1000; 

    coins = change/500; 
    cout << coins << " five dollar bills" << endl; 
    change = change % 500; 

    coins = change/100; 
    cout << coins << " one dollar bills" << endl; 
    change = change % 100; 

    coins = change/50; 
    cout << coins << " half dollars" << endl; 
    change = change % 50; 

    coins = change/25; 
    cout << coins << " quarters" << endl; 
    change = change % 25; 

    coins = change/10; 
    cout << coins << " dimes" << endl; 
    change = change % 10; 

    coins = change/5; 
    cout << coins << " nickels" << endl; 
    change = change % 5; 

    //There is one problem that I can't figure out 
    //If the number of pennies to be given for change is exactly 1, 
    //it says 0 for the number of pennies to be given as change 
    coins = change/1; 
    cout << coins << " pennies" << endl; 

    system("pause"); 
    return 0; 
} 
+1

您是否尝试过在开始时打印出“change”,看看它的价值是什么? – Barmar

+0

顺便说一句,除1之外没有任何意义,根据定义,它什么也不做。 –

+0

是的,在将其更改为整数之前将其打印出来。 –

回答

1

此代码依赖于整数除法,当你应该使用浮点除法。总之,你正在截取答案的小数部分。

让我们一步一步,使用36.91美元的输入。首先,使用$ 20张的钞票:

  1. coins = change/2000; - >coins = 3691/2000; - >coins = 1.8455;

,因为我们正在处理的整数,这属于整数除法和coins实际上是设置为1。一个20美元的账单将作为变化。

移动的,$ 10票据:

  • change = change % 2000; - >change = 3691 % 2000; - >change = 1691;
  • coins = change/1000; - >coins = 1691/1000; - >coins = 1.691;
  • 再次,这属于整数除法,所以1.691被截断,并且coins被设置为1.该程序将指示一个10美元的帐单到期。

    现在,只要$ 5美元纸币...

  • change = change % 1000; - >change = 1691 % 1000; - >change = 691;
  • coins = change/500; - >coins = 691/500; - >coins = 1.382;
  • 十进制1的组成部分。382再次下降,coins设置为1.这是一张5美元的账单。

  • change = change % 500; - >change = 691 % 500; - >change = 191;
  • coins = change/100; - >coins = 191/100; - >coins = 1.91;
  • 1.91被截断为1.这是一个$ 1纸币。

  • change = change % 100; - >change = 191 % 100; - >change = 91;
  • coins = change/50; - >coins = 91/50; - >coins = 1.82;
  • 再次,这是截断。 1.82被转换为一个整数,设置为1.一个半美元。

  • change = change % 50; - >change = 91 % 50; - >change = 41;
  • coins = change/25; - >coins = 41/25; - >coins = 1.64;
  • 四分之一。

  • change = change % 25; - >change = 41 % 25; - >change = 16;
  • coins = change/10; - >coins = 16/10; - >coins = 1.6;
  • 一个硬币。

  • change = change % 10; - >change = 16 % 10; - >change = 6;
  • coins = change/10; - >coins = 6/5; - >coins = 1.2;
  • 一个镍。

  • change = change % 5; - >change = 6 % 5; - >change = 1;
  • coins = change/1; - >coins = 1/1; - >coins = 0.9999999999999;
  • 零便士。

    原因是二值算术如何处理分割。精度下降导致0.9999999被计算,截断时将导致零便士。

    你的解决方案:由于除以1产生相同的东西(身份),请将coins = change/1;从程序中取出。

    另外,搜索浮点运算的文章。

    +0

    你是正确的,浮点数学是问题,但你的建议不是理想的。 这本质上是一个整数问题。改变你不能给某人一分钱。问题不在于他如何使用浮点,而是他使用它。 如果他只是简单地将所有双精度变为整数,所有浮点问题都会消失,他将得到正确的答案。 – ThoughtfulHacking

    3

    不幸的是你整个的常见的问题之一stubled使用双和浮点值它们不是确切地说,他们对于摇滚乐已经足够了,但是当你想要精确的时候,好,你有36.91 ...有点。这实在是36.90999999999。 你乘以100得到3690.999999999。 将其转换为整数并截断为3690.分数完全丢弃。

    你应该可以在这里工作rounding

    int change = std::round(changet);