javascript计算价格的算法很少

时间:2015-03-06 18:43:42

标签: javascript

我正在开发一个小网站,我有20个产品销售。

每周我想计算每种产品的新价格,同时考虑到每种产品的销售数量,但遵循两条规则:

  • 20种产品的总和'价格必须始终为100€
  • 我希望每个产品都是整数(无小数)或者是.5,我的意思是,一个产品的价格可以是7或8或9或7.5或8.5但不是8.3或7.1。

允许'举一个例子,但简化了4种产品:

本周卖出:

product_id  sells
----------  ------
     1       45
     2       31
     3       12
     4       62
好的,总销售额是150。

如果我将这100欧元除以150卖出,我得到0.667欧元/卖出。所以如果我将每个产品乘以这个值,我会得到:

product_id  sells  raw_price_next_week
----------  ------  -------------------
     1       45             30.015
     2       31             20.677
     3       12             8.004
     4       62             41.354

然后我需要将这些raw_prices标准化,考虑到我之前提到的第二个规则,得到每个raw_value最接近的0.5倍......

product_id  sells  raw_price_next_week    final_price
----------  ------  -------------------    ------------
     1       45             30.015             30
     2       31             20.677             20.5
     3       12             8.004              8
     4       62             41.354             41.5

我一直在考虑如何编写这个小算法,但事实是我甚至不知道如何开始。我需要一些专家帮助...

3 个答案:

答案 0 :(得分:1)

不确定是否需要实际显示完成的结果,但这应该提供正确的计算。



// Start with the raw product data (array of object - from database likely)
    var 
        products = [
            {
                product_id: 1,
                sells: 45
            },
            {
                product_id: 2,
                sells: 31
            },
            {
                product_id: 3,
                sells: 12
            },
            {
                product_id: 4,
                sells: 62
            }
        ]
    ;
    
    // ###############################################################
    
    window.Pricing = {
        
        total_sum: 100, // This represents the 100€
        sales : 0,
        
        init: function( products ) {     
            return this.calculate_final_price( products );
        },
           
        get_price_per_sale: function( products ) {
    
            for( x in products ) {
                this.sales += products[x].sells;        
            }
            
            return this.total_sum / this.sales;                
        },
        
        calculate_final_price: function( products ) {
                    
            var price_per_sale = this.get_price_per_sale( products );
            
            for( x in products ) {
                products[x].raw_price_next_week = +( products[x].sells * price_per_sale );
                products[x].final_price = +( Math.round( products[x].raw_price_next_week * 2 ) / 2 ).toFixed(1);        
            }
            
            return products;
        }
        
    };
    
    // ###############################################################
    
    // Init the pricing calculations and get the final objects with updated pricing.
    Pricing.init( products );




在这里小提琴:http://jsfiddle.net/0nbbojp9/1/

答案 1 :(得分:0)

好的,这就是我在javascript中提出的,就像你要求的那样。您也可以测试here

// 1.) Set array for product prices... I just put a random number of products
var productPrices = [10,20,20,30,30,30,25,10];

// 2.) Get initial total price to calculate price change
var productPriceSum = 0;
for (var i = 0; i < productPrices.length; i++) {
    productPriceSum += productPrices[i];
}
var priceChange = (100/productPriceSum);

// 3.) Change prices rounding to the nearest .5
productPriceSum = 0;
for (var i = 0; i < productPrices.length; i++) {
    var newPrice = Math.round((productPrices[i]*priceChange)*10)/10
    var npDecimal = (newPrice - Math.floor(newPrice))
    if(npDecimal < 0.5){
        newPrice = Math.floor(newPrice)
    }else{
        newPrice = Math.floor(newPrice) + .5
    }
    productPrices[i] = newPrice;
    productPriceSum += newPrice;
}

// 4.) Account for any missing or excess of numbers to get the total back to 100
var makeEvenHundred = (100 - productPriceSum)
for(var i = 0; i < (makeEvenHundred*2); i ++){
    if(makeEvenHundred < 0){
        productPrices[i] -= .5
    }else{
        productPrices[i] += .5
    }
}

// Proof it all worked!
productPriceSum = 0;
for (var i = 0; i < productPrices.length; i++) {
    alert('Product # ' + (i+1) + ' Price: ' + productPrices[i]);
    productPriceSum += productPrices[i];
}
alert('Total: ' + productPriceSum);

另请注意,第4节可能需要调整,但您希望逻辑在那里工作。我把它扔到一起的方式,它会添加或删除第一个价格的值,直到总数回到100.还假设实际上有足够的产品一次添加或删除.5你说20,所以我认为这样可行。)

所以,如果这个网站取得了成功,那就知道我为你完成了所有的工作;)

答案 2 :(得分:0)

解决方案

诀窍是将问题分解成小块并分别处理每个问题。这是细分:

  1. 将值向下舍入为最接近的整数。
  2. 捕获小数值。
  3. 除以小数值,看看有多少&#39; 0.5&#39组成这个值。
  4. 将0.5的数量加倍,得到最接近的0.5值。
  5. 将值与1的值相加。
  6. 您也可以调整closest变量以舍入到不同的值。

    以下是此实施。您可以使用map函数对数据数组中的所有值执行normalization。在你的情况下,它将是一些ajax调用的结果。

    实施

    &#13;
    &#13;
    var data = [30.015, 20.677, 8.004, 41.354];
    
    function normalize(value) {
      var closest = 0.5;
      var significand = Math.floor(value);
      var mantissa = (value % 1).toFixed(2);
      var normalized = Math.round(mantissa / closest) * closest;
      return significand + normalized;
    }
    
    var normalized = data.map(normalize);
    
    console.log(normalized);
    &#13;
    <script src="https://getfirebug.com/firebug-lite-debug.js"></script>
    &#13;
    &#13;
    &#13;

    资源