我在工作中遇到困难,我想在工作中解决这个问题。
我需要在HTML / JS中有一个表单,该表单使用Stripe进行付款,然后进行计算以查找一些稍后可以存储的值。该表格需要付款,付款将在公司和客户之间分配。
最低付款金额为1美元,无论如何,公司一开始会收取所收取金额的1%。客户收到Stripe费用后的剩余款项,并从公司中扣除上述1%的款项。
[还需要有一种可选的方式来支付公司和Stripe费用,以便在扣除Stripe费用和公司费用后,客户获得指定的金额。
这听起来有点令人困惑,例如:
最近,我开始担心浮点计算不正确的陷阱,以及它们如何影响货币计算。
(我最近才发现浮点数不准确,当我在进行此项目时在Web控制台中将两个浮点数加在一起时得到了意外的结果后,偶然发现了一些信息。我被链接this video到解释。)
我以前编写的函数可以满足我上面解释的所有要求,但现在我担心我的解决方案可能有缺陷,我对所写内容的不确定性感到不胜其烦。我想从其他开发人员那里获得一些见识,以帮助我更改代码以使其更安全。
我曾尝试使用dinero.js重写函数,但发现我变得有些困惑。我的数学成绩很差,所以到目前为止我已经尽力了。
下面是我当前的函数,它接收一个JS浮点值(来自文本输入)和一个布尔值,用于确定是否应支付交易费用。让我真正感到困惑的是,在测试交易之后,我一直希望在Stripe仪表板中验证数据时出现问题,并且还没有发现我的功能未能按预期工作的情况。
我对代码进行的最后更改是使函数返回整数值,以将其存储为元数据,以便在单独的Web应用程序中进行进一步处理。 (例如199代表1.99美元)
感谢您阅读到目前为止的问题,如果您愿意,请帮助我。非常感谢任何有见地的回答,它们可以帮助我进一步了解如何更改代码。
function account_for_fees(amount,cover) { //amount is a string representation of an amount in USD e.g. "1.00"
if(cover) {
amount = parseFloat(amount);
var company_fee = Math.round((amount * 0.01)*100)/100; //company fee of initial charge (1%)
amount += company_fee;
//Calculate stripe fees based on amount
var f = (amount * 0.029) + 0.3;
var p = (amount + 0.3) / (1 - 0.029);
var cn = ((p - ((p * 0.029) + 0.3)) - company_fee);
return {
charge: Math.round(p * 100),
stripe_fee: Math.round(((p * 0.029) + 0.3) * 100),
client_net: Math.round(cn * 100),
company_net: Math.round(company_fee * 100)
};
}
else {
var r = parseFloat(amount);
var company_fee = Math.round((r * 0.01) * 100) / 100;
var cn = ((r - ((r * 0.029) + 0.3)) - company_fee);
return {
charge: (Math.round(r * 100)),
stripe_fee: (Math.round(((r * 0.029) + 0.3) * 100)),
client_net: (Math.round(cn * 100)),
company_net: (Math.round(company_fee * 100))
};
}
}
function account_for_fees(amount,cover) { //amount is a string representation of an amount in USD e.g. "1.00"
if(cover) {
amount = parseFloat(amount) * 100;
var company_fee = Math.round(amount * 0.01); //company fee of initial charge (1%)
amount += company_fee;
//Calculate stripe fees based on amount
var f = Math.round((amount * 0.029)) + 30;
var p = Math.round((amount + 30) / (1 - 0.029));
var cn = ((p - (Math.round(p * 0.029) + 30)) - company_fee);
return {
charge: p,
stripe_fee: (Math.round(p * 0.029) + 30),
client_net: cn,
company_net: company_fee
};
}
else {
var amount = parseFloat(amount) * 100;
var company_fee = Math.round((amount * 0.01));
var cn = ((amount - (Math.round(amount * 0.029) + 30)) - company_fee);
return {
charge: amount,
stripe_fee: (Math.round(amount * 0.029) + 30),
client_net: cn,
company_net: company_fee
};
}
}