2015-10-26 24 views
-5

我試圖想出一個更好的方式來計算給定成本價格,單位價格(銷售價格)和稅務信息時的保證金百分比。計算成本價格,單位價格和稅務信息的保證金百分比的更有效方法

下面的代碼有效;但在任何方面都不是很有效率。它只是從-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

你的問題不應該是一個謎。以有組織的,明確定義的方式提供細節,而不是在任意代碼中隨機無意義的評論。 – Amit

+0

我不知道我如何能更好地解釋這一點。我刪除了所有不必要的代碼,並以我知道的最佳方式顯示代碼。我正在循環-100% - > 1000%以試圖找到保證金百分比。 –

+0

然後讀[問]。 – Amit

回答

1

這裏有兩個解決方案 - 一個是解決你實際上呈現(因爲這裏不需要估計)問題的代數,另一種是做估算代碼如果它需要。

代數:

如果我們表達的標記率和兩個稅率爲1 + increase%,它使我們的數學更容易。也就是說,對於50%的加價,將其視爲1.5的倍數;對於10%的稅率,將其視爲1.1的乘數。算這樣一來,你的公式爲:

因爲我們這裏相乘,他們倆都是百分比的增加,我們運用稅收秩序實際上並不重要...其實,事實第二個稅包括其應稅額中的第一個稅使我們的數學更容易。

求解markup,散發出來到:

markup = unit_price/(cost * tax1 * tax2)

代碼:

現在,做這種估計的代碼 - 這是有趣的,儘管這個問題沒有按不需要它。這個問題有一些有用的特性:

  • 你可以看一下潛在的答案,而不是隻知道它是正確的,但你可以告訴它是否過高或過低
  • 值是連續
  • 的值是成正比的輸入,即使按比例改變

鑑於這些,你可以通過合理值的空間遞歸二進制搜索解決這個問題,而且比線性搜索執行少得多的比較。

我會做這樣的事情:

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)) 
+0

我不認爲我解釋了2%的稅率是如何工作的。可以說價格是「100」,第一稅率是「10%」,第二稅率是「10%」。這意味着第一個稅是'10.00',第二個稅是'11.00'(110 * .1),總數是'121.00'。這是使它變得棘手的部分。 –

+0

@ChrisMuench我明白了。 100 * 1.1 * 1.1 = 121 –

+0

我嘗試了你設定的公式,我沒有像以前那樣得到正確的值。我編輯了我的問題,以舉例說明我嘗試過的內容。 –