这样做的目的是给出最小票据/硬币数量的变化。到目前为止,我的代码适用于所有值,除了那些包含2p或1p硬币的值,例如。 12.33给出1英镑10英镑,1英镑2英镑,1 20英镑,1 10英镑和1 2p,但没有1p。我也试过了2p,它给了1个1p,1p给了0个硬币。我无法弄清楚这些特定值的错误,因为每个面额的代码都是相同的。
#include <iostream>
using namespace std;
int main()
{
float change;
int fifty = 0;
int twenty = 0;
int ten = 0;
int five = 0;
int two = 0;
int one = 0;
int fiftyp = 0;
int twentyp = 0;
int tenp = 0;
int fivep = 0;
int twop = 0;
int onep = 0;
cout << "Please enter the amount of change given:\n";
cin >> change;
while ( change >= 50)
{
fifty++;
change -= 50;
}
while ( change >= 20)
{
twenty++;
change -= 20;
}
while ( change >= 10)
{
ten++;
change -= 10;
}
while ( change >= 5)
{
five++;
change -= 5;
}
while ( change >= 2)
{
two++;
change -= 2;
}
while ( change >= 1)
{
one++;
change -= 1;
}
while ( change >= 0.5)
{
fiftyp++;
change -= 0.5;
}
while ( change >= 0.2)
{
twentyp++;
change -= 0.2;
}
while ( change >= 0.1)
{
tenp++;
change -= 0.1;
}
while ( change >= 0.05)
{
fivep++;
change -= 0.05;
}
while ( change >= 0.02)
{
twop++;
change -= 0.02;
}
while ( change >= 0.01)
{
onep++;
change -= 0.01;
}
cout << "Give " << fifty << " £50 notes.\n";
cout << "Give " << twenty << " £20 notes.\n";
cout << "Give " << ten << " £10 notes.\n";
cout << "Give " << five << " £5 notes.\n";
cout << "Give " << two << " £2 coins.\n";
cout << "Give " << one << " £1 coins.\n";
cout << "Give " << fiftyp << " 50p coins.\n";
cout << "Give " << twentyp << " 20p coins.\n";
cout << "Give " << tenp << " 10p coins.\n";
cout << "Give " << fivep << " 5p coins.\n";
cout << "Give " << twop << " 2p coins.\n";
cout << "Give " << onep << " 1p coins.\n";
return 0;
}
答案 0 :(得分:4)
问题是浮点数学。考虑在程序结束时添加以下行:
cout << "Change left: " << change << '\n';
以12.33
作为输入运行程序会导致:
Change left: 0.00999992
显然这不到0.01
。虽然您可以尝试添加软糖因子来处理与完美数字的“小”偏差,但通常最好使用整数来赚钱,这样1
等于1美分。你应该通过适当的舍入来进行这种转换:
long int cents = lrintf(change * 100.0);
然后像这样替换你的while循环:
while (cents >= 5000) {
fifty++;
cents -= 5000;
}
等等。
答案 1 :(得分:2)
问题在于var anotherFilter = {
matchType=contains,
type=1,
value=c
};
request.rules[1].pageFilters.push(anotherFilter);
无法表示所有十进制数,而float
实际上略小于0.02(并且0.02
小于0.01)。
补救措施是对代表你最小面额的整数(即一分钱)进行计算。
让用户以便士的形式输入金额,或者读取你解析的字符串
后一种方法既复杂又方便用户,但首先使用前一种方法获得工作程序可能是一个好主意。
(这两种方法都可以忽略无意义的数量,如3.14159265。)
我还建议你阅读精美的C ++书中的循环和数组。
答案 2 :(得分:0)
下面/上面的答案解决了你实际问的问题 但是,我认为你实际上并没有问自己正确的问题 这是使用数组:
制作程序的另一种更简单的方法git shortlog -s -n
如果您想随时更改硬币的金额/价值,请考虑使用向量而不是数组