我正在开发一个小网站,我有20个产品销售。
每周我想计算每种产品的新价格,同时考虑到每种产品的销售数量,但遵循两条规则:
允许'举一个例子,但简化了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
我一直在考虑如何编写这个小算法,但事实是我甚至不知道如何开始。我需要一些专家帮助...
答案 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 );

答案 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)
诀窍是将问题分解成小块并分别处理每个问题。这是细分:
您也可以调整closest
变量以舍入到不同的值。
以下是此实施。您可以使用map
函数对数据数组中的所有值执行normalization
。在你的情况下,它将是一些ajax调用的结果。
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;