我试图在给定成本价格,单价(销售价格)和税务信息时提出更好的方法来计算保证金百分比。
以下代码有效;但是在任何方面效率都不高。它只是循环遍历-100 - >的所有边际百分比。 1000%,当找到解决方案时,它会停止查看并突破循环。
我的目标是没有一个长时间运行的循环,而是直接计算它而不是错误的试验。它如此棘手的原因是因为设置了税收的方式。它不仅仅是一个百分比。有关如何计算税额的信息,请参阅注释。 (累计税)
var cost_price = 100;
var unit_price = 133.10;
//Loop over -100 -> 1000 percent at .01 intervals to try to find margin percent...Not very good
for(var k=-100;k<1000;k+=.01)
{
var margin_percent = k;
var marked_up_price_before_tax = cost_price * (1+(margin_percent/100));
//First tax is 10%...This value is dynamic...could be a different percent
var first_tax = (marked_up_price_before_tax*(10/100));
//Second tax is 10% cumulative...This value is dynamic.. Could be a different percent
var second_tax = (marked_up_price_before_tax + first_tax) *10/100);
var margin_price = marked_up_price_before_tax + first_tax + second_tax;
//Make 2 decimals for comparison purposes
margin_price = parseFloat(Math.round(margin_price * 100) / 100).toFixed(2);
if (margin_price == unit_price)
{
//FOUND IT!
margin_percent = parseFloat(k);
break;
}
}
答案 0 :(得分:1)
这里有两种解决方案 - 一种是解决您实际呈现的问题的代数(因为此处不需要估算),另一种是用于估算是否需要的代码。
<强>代数:强>
如果我们将加价率和税率表示为1 + increase%
,那么我们的数学运算会更容易。也就是说,对于50%的加价,将其视为1.5的乘数;对于10%的税率,将其视为1.1的乘数。以这种方式计算,你的等式是:
unit_price = cost * markup * tax1 * tax2
因为我们在这里成倍增加,而且他们的百分比增加,我们应用税的订单实际上并不重要......事实上,第二税包括第一税的事实在其应税金额使我们的数学更容易。
解决markup
,其中包含:
markup = unit_price / (cost * tax1 * tax2)
<强>代码:强>
现在,进行这种估算的代码 - 这很有趣,即使这个问题并不需要它。这个问题有一些有用的特点:
鉴于这些,你可以通过合理值的空间进行递归二进制搜索来解决这个问题,并且比线性搜索执行FAR更少的比较。
我做这样的事情:
var cost_price = 100;
var unit_price = 130;
var tax_rate_1 = 1.1;
var tax_rate_2 = 1.1;
function estimateMarkup(minMarkup, maxMarkup) {
if (maxMarkup - minMarkup < 0.001) return null;
let markup = (minMarkup + maxMarkup) / 2
let markedupPrice = cost_price * markup * tax_rate_1 * tax_rate_2;
if (Math.round(markedupPrice) == Math.round(unit_price))
return markup;
if (Math.round(markedupPrice) > Math.round(unit_price))
return estimateMarkup(minMarkup,markup);
if (Math.round(markedupPrice) < Math.round(unit_price))
return estimateMarkup(markup,maxMarkup);
}
console.log(estimateMarkup(-100,100))