javascript 函数生成精确更改时出现问题
Trouble with javascript function to generate exact change
我正在应对来自在线编码社区的挑战。
目标是编写一个生成精确变化的函数
从最高到最低使用中显示的面额
CID 数组(抽屉里的现金)。该函数需要三个
参数,价格,现金,cid。 Cid 是抽屉里的现金。
我正在尝试比较
cid 中的面额与现金金额
精确的变化计算。
例如,如果 change = 96,则从最高到
最低的是
['twenty', 80], ['ten', 1], ['five', 1],
['one', 1]
。但是,如果 CID 显示 ['twenty', 60], ['ten', 20], ["five, 55] 那么
代码必须使用 cid 中的金额计算准确的变化。
在这种情况下,结果将是
['twenty', 60], ['ten', 20],
['five', 15], ['one', 1]
在我下面的代码中,display() 函数包含一个条件语句
打算在CID值中进行比较和切换
如有必要。但是,这会导致重复值
["TWENTY"] 出现。我的问题是什么导致了这个和
我该如何解决它。
函数的输入产生了不正确的结果:
[ [ 'TWENTY', 60 ],
[ 'TWENTY', 20 ],
[ 'TEN', 10 ],
[ 'FIVE', 5 ],
[ 'ONE', 1 ],
[ 'QUARTER', 0.5 ],
[ 'DIME', 0.2 ],
[ 'PENNY', 0.04 ] ]
我已经包含了下面的代码,但是我已经建立了一个模型]
在 http://repl.it/BAku/2.
function drawer(price, cash, cid){
var change = cash - price;
change = change.toFixed(2);
change = +change;
var combine = [];
var cidMap = [ cid[0], cid[1], cid[2], cid[3], cid[4], cid[5], cid[6], cid[7], cid[8] ];
var denomMap = [
100, 'ONE HUNDRED', 20, 'TWENTY', 10, 'TEN', 5, 'FIVE', 1, 'ONE', 0.25, 'QUARTER', 0.1, 'DIME', 0.05, 'NICKEL', 0.01, "PENNY"
];
function total(cid){
var cashAmts = [];
cid.forEach(function(v){
cashAmts.push(v[1]);
},0);
var sum = cashAmts.reduce(function(a, b){return a + b;
}).toFixed(2);
return +sum;
}
if(cash < price){
return price;
}
else if(total(cid) < change){
return "Insufficient Funds";
}
else if(total(cid) === change){
return "Closed";
}
else if(total(cid) > change){
return display(change, cid);
}
function display(change) {
var temp;
num = change;
var num = change;
var value = '';
for (var i = 0; change > 0 && i < denomMap.length; i += 2) {
while (change >= denomMap[i]) {
change += denomMap[i + 1];
change = change.replace(/\d+/g, "");
change = change.replace(/\./g, "");
value += denomMap[i];
var div = Math.floor(num/+value) * denomMap[i];
if(change === cidMap[0][0] && div > cidMap[0][1]){
div = cidMap[0][1];
}
else if(change === cidMap[1][0] && div > cidMap[1][1]){
div = cidMap[1][1];
}
else if(change === cidMap[2][0] && div > cidMap[2][1]){
div = cidMap[2][1];
}
else if(change === cidMap[3][0] && div > cidMap[3][1]){
div = cidMap[3][1];
}
else if(change === cidMap[4][0] && div > cidMap[4][1]){
div = cidMap[4][1];
}
else if(change === cidMap[5][0] && div > cidMap[5][1]){
div = cidMap[5][1];
}
else if(change === cidMap[6][0] && div > cidMap[6][1]){
div = cidMap[6][1];
}
else if(change === cidMap[7][0] && div > cidMap[7][1]){
div = cidMap[7][1];
}
else if(change === cidMap[8][0] && div > cidMap[8][1]){
div = cidMap[8][1];
}
temp = [change, div];
combine.push(temp);
num = (num - div).toFixed(2);
num = +num;
display(num);
}
}
return combine;
}
}
drawer(3.26, 100.00, [['PENNY', 1.01], ['NICKEL', 2.05], ['DIME', 3.10], ['QUARTER', 4.25], ['ONE', 90.00], ['FIVE', 55.00], ['TEN', 20.00], ['TWENTY', 60.00], ['ONE HUNDRED', 100.00]]);
What is causing this?
您正在从抽屉中取出所有三个 'TWENTY'
笔记,但没有更新抽屉以反映现在没有 'TWENTY'
笔记了。所以在下一个循环迭代中,抽屉错误地认为你还有另一个 'TWENTY'
便条要给。
How do I fix it?
提款后更新抽屉中的现金,并包括一张剩余现金的支票。这是一种对原始代码进行最少修改的方法,可帮助您了解一些信息。
记下 changeAvailable
函数及其调用位置。还要注意抽屉的更新(例如三个 TWENTY
音符:cidMap[7][1] = 0;
)。
http://jsbin.com/vapobu/edit?js,console
(function () {
"use strict";
function drawer(price, cash, cid){
var change = cash - price;
change = change.toFixed(2);
change = +change;
var combine = [];
var cidMap = [ cid[0], cid[1], cid[2], cid[3], cid[4], cid[5], cid[6], cid[7], cid[8] ];
var denomMap = [
100, 'ONE HUNDRED', 20, 'TWENTY', 10, 'TEN', 5, 'FIVE', 1, 'ONE', 0.25, 'QUARTER', 0.1, 'DIME', 0.05, 'NICKEL', 0.01, "PENNY"
];
function display(change) {
var temp;
//num = change;//use global variables sparingly, preferably within a namespace, suspect type-o
var num = change;
var value = '',
changeAvailable = function (nameOfCurrency) {
var queryCash = cid.filter(function (currentCurrency) {
return currentCurrency[0] === nameOfCurrency;
}),
cashRemaining = queryCash[0][1];
return (cashRemaining !== 0);
};
for (var i = 0; change > 0 && i < denomMap.length; i += 2) {
while (change >= denomMap[i] && changeAvailable(denomMap[i + 1])) {
change += denomMap[i + 1];
change = change.replace(/\d+/g, "");
change = change.replace(/\./g, "");
value += denomMap[i];
var div;
div = Math.floor(num/+value) * denomMap[i];
if(change === cidMap[0][0] && div > cidMap[0][1]){
div = cidMap[0][1];
cidMap[0][1] = 0;
}
else if(change === cidMap[1][0] && div > cidMap[1][1]){
div = cidMap[1][1];
cidMap[1][1] = 0;
}
else if(change === cidMap[2][0] && div > cidMap[2][1]){
div = cidMap[2][1];
cidMap[2][1] = 0;
}
else if(change === cidMap[3][0] && div > cidMap[3][1]){
div = cidMap[3][1];
cidMap[3][1] = 0;
}
else if(change === cidMap[4][0] && div > cidMap[4][1]){
div = cidMap[4][1];
cidMap[4][1] = 0;
}
else if(change === cidMap[5][0] && div > cidMap[5][1]){
div = cidMap[5][1];
cidMap[5][1] = 0;
}
else if(change === cidMap[6][0] && div > cidMap[6][1]){
div = cidMap[6][1];
cidMap[6][1] = 0;
}
else if(change === cidMap[7][0] && div > cidMap[7][1]){
div = cidMap[7][1];
cidMap[7][1] = 0;
//temp = [change, div];//duplicated code
}
else if(change === cidMap[8][0] && div > cidMap[8][1]){
div = cidMap[8][1];
cidMap[8][1] = 0;
}
temp = [change, div];
combine.push(temp);
num = (num - div).toFixed(2);
num = +num;
display(num);
}
}
return combine;
}
function total(cid){
var cashAmts = [];
cid.forEach(function(v){
cashAmts.push(v[1]);
},0);
var sum = cashAmts.reduce(function(a, b){return a + b;
}).toFixed(2);
return +sum;
}
if(cash < price){
return price;
}
else if(total(cid) < change){
return "Insufficient Funds";
}
else if(total(cid) === change){
return "Closed";
}
else if(total(cid) > change){
return display(change, cid);
}
}
console.log(drawer(3.26, 100.00, [['PENNY', 1.01], ['NICKEL', 2.05], ['DIME', 3.10], ['QUARTER', 4.25], ['ONE', 90.00], ['FIVE', 55.00], ['TEN', 20.00], ['TWENTY', 60.00], ['ONE HUNDRED', 100.00]]));
}());
我正在应对来自在线编码社区的挑战。 目标是编写一个生成精确变化的函数 从最高到最低使用中显示的面额 CID 数组(抽屉里的现金)。该函数需要三个 参数,价格,现金,cid。 Cid 是抽屉里的现金。
我正在尝试比较 cid 中的面额与现金金额 精确的变化计算。
例如,如果 change = 96,则从最高到 最低的是
['twenty', 80], ['ten', 1], ['five', 1],
['one', 1]
。但是,如果 CID 显示 ['twenty', 60], ['ten', 20], ["five, 55] 那么 代码必须使用 cid 中的金额计算准确的变化。 在这种情况下,结果将是
['twenty', 60], ['ten', 20],
['five', 15], ['one', 1]
在我下面的代码中,display() 函数包含一个条件语句 打算在CID值中进行比较和切换 如有必要。但是,这会导致重复值 ["TWENTY"] 出现。我的问题是什么导致了这个和 我该如何解决它。
函数的输入产生了不正确的结果:
[ [ 'TWENTY', 60 ],
[ 'TWENTY', 20 ],
[ 'TEN', 10 ],
[ 'FIVE', 5 ],
[ 'ONE', 1 ],
[ 'QUARTER', 0.5 ],
[ 'DIME', 0.2 ],
[ 'PENNY', 0.04 ] ]
我已经包含了下面的代码,但是我已经建立了一个模型] 在 http://repl.it/BAku/2.
function drawer(price, cash, cid){
var change = cash - price;
change = change.toFixed(2);
change = +change;
var combine = [];
var cidMap = [ cid[0], cid[1], cid[2], cid[3], cid[4], cid[5], cid[6], cid[7], cid[8] ];
var denomMap = [
100, 'ONE HUNDRED', 20, 'TWENTY', 10, 'TEN', 5, 'FIVE', 1, 'ONE', 0.25, 'QUARTER', 0.1, 'DIME', 0.05, 'NICKEL', 0.01, "PENNY"
];
function total(cid){
var cashAmts = [];
cid.forEach(function(v){
cashAmts.push(v[1]);
},0);
var sum = cashAmts.reduce(function(a, b){return a + b;
}).toFixed(2);
return +sum;
}
if(cash < price){
return price;
}
else if(total(cid) < change){
return "Insufficient Funds";
}
else if(total(cid) === change){
return "Closed";
}
else if(total(cid) > change){
return display(change, cid);
}
function display(change) {
var temp;
num = change;
var num = change;
var value = '';
for (var i = 0; change > 0 && i < denomMap.length; i += 2) {
while (change >= denomMap[i]) {
change += denomMap[i + 1];
change = change.replace(/\d+/g, "");
change = change.replace(/\./g, "");
value += denomMap[i];
var div = Math.floor(num/+value) * denomMap[i];
if(change === cidMap[0][0] && div > cidMap[0][1]){
div = cidMap[0][1];
}
else if(change === cidMap[1][0] && div > cidMap[1][1]){
div = cidMap[1][1];
}
else if(change === cidMap[2][0] && div > cidMap[2][1]){
div = cidMap[2][1];
}
else if(change === cidMap[3][0] && div > cidMap[3][1]){
div = cidMap[3][1];
}
else if(change === cidMap[4][0] && div > cidMap[4][1]){
div = cidMap[4][1];
}
else if(change === cidMap[5][0] && div > cidMap[5][1]){
div = cidMap[5][1];
}
else if(change === cidMap[6][0] && div > cidMap[6][1]){
div = cidMap[6][1];
}
else if(change === cidMap[7][0] && div > cidMap[7][1]){
div = cidMap[7][1];
}
else if(change === cidMap[8][0] && div > cidMap[8][1]){
div = cidMap[8][1];
}
temp = [change, div];
combine.push(temp);
num = (num - div).toFixed(2);
num = +num;
display(num);
}
}
return combine;
}
}
drawer(3.26, 100.00, [['PENNY', 1.01], ['NICKEL', 2.05], ['DIME', 3.10], ['QUARTER', 4.25], ['ONE', 90.00], ['FIVE', 55.00], ['TEN', 20.00], ['TWENTY', 60.00], ['ONE HUNDRED', 100.00]]);
What is causing this?
您正在从抽屉中取出所有三个 'TWENTY'
笔记,但没有更新抽屉以反映现在没有 'TWENTY'
笔记了。所以在下一个循环迭代中,抽屉错误地认为你还有另一个 'TWENTY'
便条要给。
How do I fix it?
提款后更新抽屉中的现金,并包括一张剩余现金的支票。这是一种对原始代码进行最少修改的方法,可帮助您了解一些信息。
记下 changeAvailable
函数及其调用位置。还要注意抽屉的更新(例如三个 TWENTY
音符:cidMap[7][1] = 0;
)。
http://jsbin.com/vapobu/edit?js,console
(function () {
"use strict";
function drawer(price, cash, cid){
var change = cash - price;
change = change.toFixed(2);
change = +change;
var combine = [];
var cidMap = [ cid[0], cid[1], cid[2], cid[3], cid[4], cid[5], cid[6], cid[7], cid[8] ];
var denomMap = [
100, 'ONE HUNDRED', 20, 'TWENTY', 10, 'TEN', 5, 'FIVE', 1, 'ONE', 0.25, 'QUARTER', 0.1, 'DIME', 0.05, 'NICKEL', 0.01, "PENNY"
];
function display(change) {
var temp;
//num = change;//use global variables sparingly, preferably within a namespace, suspect type-o
var num = change;
var value = '',
changeAvailable = function (nameOfCurrency) {
var queryCash = cid.filter(function (currentCurrency) {
return currentCurrency[0] === nameOfCurrency;
}),
cashRemaining = queryCash[0][1];
return (cashRemaining !== 0);
};
for (var i = 0; change > 0 && i < denomMap.length; i += 2) {
while (change >= denomMap[i] && changeAvailable(denomMap[i + 1])) {
change += denomMap[i + 1];
change = change.replace(/\d+/g, "");
change = change.replace(/\./g, "");
value += denomMap[i];
var div;
div = Math.floor(num/+value) * denomMap[i];
if(change === cidMap[0][0] && div > cidMap[0][1]){
div = cidMap[0][1];
cidMap[0][1] = 0;
}
else if(change === cidMap[1][0] && div > cidMap[1][1]){
div = cidMap[1][1];
cidMap[1][1] = 0;
}
else if(change === cidMap[2][0] && div > cidMap[2][1]){
div = cidMap[2][1];
cidMap[2][1] = 0;
}
else if(change === cidMap[3][0] && div > cidMap[3][1]){
div = cidMap[3][1];
cidMap[3][1] = 0;
}
else if(change === cidMap[4][0] && div > cidMap[4][1]){
div = cidMap[4][1];
cidMap[4][1] = 0;
}
else if(change === cidMap[5][0] && div > cidMap[5][1]){
div = cidMap[5][1];
cidMap[5][1] = 0;
}
else if(change === cidMap[6][0] && div > cidMap[6][1]){
div = cidMap[6][1];
cidMap[6][1] = 0;
}
else if(change === cidMap[7][0] && div > cidMap[7][1]){
div = cidMap[7][1];
cidMap[7][1] = 0;
//temp = [change, div];//duplicated code
}
else if(change === cidMap[8][0] && div > cidMap[8][1]){
div = cidMap[8][1];
cidMap[8][1] = 0;
}
temp = [change, div];
combine.push(temp);
num = (num - div).toFixed(2);
num = +num;
display(num);
}
}
return combine;
}
function total(cid){
var cashAmts = [];
cid.forEach(function(v){
cashAmts.push(v[1]);
},0);
var sum = cashAmts.reduce(function(a, b){return a + b;
}).toFixed(2);
return +sum;
}
if(cash < price){
return price;
}
else if(total(cid) < change){
return "Insufficient Funds";
}
else if(total(cid) === change){
return "Closed";
}
else if(total(cid) > change){
return display(change, cid);
}
}
console.log(drawer(3.26, 100.00, [['PENNY', 1.01], ['NICKEL', 2.05], ['DIME', 3.10], ['QUARTER', 4.25], ['ONE', 90.00], ['FIVE', 55.00], ['TEN', 20.00], ['TWENTY', 60.00], ['ONE HUNDRED', 100.00]]));
}());