我有一个允许用户编辑价格的对话框。现在您可以输入成本价,它会计算出批发价和零售价,或者您可以输入批发价,它会计算出零售价和成本价,或者您可以输入零售价,它会计算出批发价和成本价。我一直使用 496.38 作为成本价,因此如果我将该值输入成本价字段,它会显示我的批发价为 684.05,零售价为 170.27。如果输入总价684.05,则显示我的成本价为496.38,零售价为170.27,这一切都很好。问题是如果我先进入零售领域,我输入170.27,成本价变成496.37,整体变成684.04,成本是496.37。
我的功能
private decimal CostPrice
{
get => SelectedItem.Cost;
set
{
SelectedItem.Cost = value;
SelectedItem.WholesalePrice = Math.Round(((((decimal)SelectedItem.Cost+(decimal)SelectedItem.Transport+(decimal)SelectedItem.RoyaltyMarket+((decimal)SelectedItem.DelStrand))/(1-(decimal)SelectedItem.Margin)*(1+(decimal)SelectedItem.AdjPercentage))+(decimal)SelectedItem.Levy),2); // Calculate and set the wholesale price
SelectedItem.RecRetailPrice =Math.Round((((decimal)SelectedItem.WholesalePrice / (1m - 0.23m)) * (100m + 15m) / 100m ) / (SelectedItem.StockUom) , 2);
/*CalculateRetailPrice(SelectedItem.WholesalePrice);*/ // Calculate and set the retail price
}
}
private decimal WholesalePrice
{
get => SelectedItem.WholesalePrice;
set
{
SelectedItem.WholesalePrice = value;
SelectedItem.RecRetailPrice = Math.Round((((decimal)SelectedItem.WholesalePrice/(1m-0.23m))*(100+15)/100)/SelectedItem.StockUom,2);
SelectedItem.Cost= Math.Round((((decimal)SelectedItem.WholesalePrice-(decimal)SelectedItem.Levy)/(1+(decimal)SelectedItem.AdjPercentage))*(1-(decimal)SelectedItem.Margin)-(decimal)SelectedItem.Transport-(decimal)SelectedItem.RoyaltyMarket-(decimal)SelectedItem.DelStrand,2);
}
}
private decimal RecRetailPrice
{
get => SelectedItem.RecRetailPrice;
set
{
SelectedItem.RecRetailPrice = value;
SelectedItem.WholesalePrice =Math.Round((((decimal)SelectedItem.RecRetailPrice * (1m - 0.23m))/(100+15)*100)*SelectedItem.StockUom,2);
SelectedItem.Cost = Math.Round((((SelectedItem.WholesalePrice - (decimal)SelectedItem.Levy) / (1m + (decimal)SelectedItem.AdjPercentage)) * (1m - (decimal)SelectedItem.Margin)) - (decimal)SelectedItem.Transport - (decimal)SelectedItem.RoyaltyMarket - (decimal)SelectedItem.DelStrand,2);
}
}
我尝试删除 Math.Round 并以任何可能的组合更改计算,但没有结果
所有计算都归结为两个函数及其反函数
private decimal GetWholesaleFromRetail(decimal amount)
{
return amount * (decimal)( (1 - 0.23f) / (1 + 0.15f) * StockUom);
}
private decimal GetRetailFromWholesale(decimal amount)
{
return amount / (decimal)( (1 - 0.23f) / (1 + 0.15f) * StockUom);
}
private decimal GetCostFromWholesale(decimal amount)
{
return (amount - Levy) / (decimal)((1 + AdjPercentage) * (1 - Margin)) - Transport - RoyaltyMarket - DelStrand;
}
private decimal GetWholesaleFromCost(decimal amount)
{
return ((amount + Transport + RoyaltyMarket + DelStrand) / (decimal)((1 - Margin) * (1 + AdjPercentage))) + Levy;
}
但我确信这里存在数学错误,导致结果不一致。
如果您往返
[Retail]->[Wholesale]->[Retail]
,您最终会得到相同的号码吗?
也适用于
[Wholesale]->[Cost]->[Wholesale]
不可能用实际数字进行测试,因为您没有在帖子中给出所有依赖值。
我还建议创建一个类,其中包含要在代码中使用的所有计算,如下所示:
Item SelectedItem = new Item(
margin: 0.1f,
adjPercentage: 0.05f,
stockUom: 0.03f,
levy: 30m,
transport: 50m,
royaltyMarket: 5m,
delStrand: 4m);
SelectedItem.Cost = 1000m;
Console.WriteLine($" Cost = {SelectedItem.Cost:m2}");
Console.WriteLine($"Wholesale = {SelectedItem.WholesalePrice:m2}");
Console.WriteLine($" Retail = {SelectedItem.RecRetailPrice:m2}");
并且类
Item
将包含所需的所有值以及不同的金额(成本、批发、零售)作为参数。
public class Item
{
decimal _cost;
decimal _wholesalePrice;
decimal _recRetailPrice;
public Item(float adjPercentage, float margin, decimal royaltyMarket, decimal transport, decimal delStrand, float stockUom, decimal levy)
{
AdjPercentage = adjPercentage;
Margin = margin;
RoyaltyMarket = royaltyMarket;
Transport = transport;
DelStrand = delStrand;
StockUom = stockUom;
Levy = levy;
}
public decimal Cost
{
get => _cost;
set
{
_cost = value;
_wholesalePrice = GetWholesaleFromCost(_cost);
_recRetailPrice = GetRetailFromWholesale(_wholesalePrice);
}
}
public decimal WholesalePrice
{
get => _wholesalePrice;
set
{
_wholesalePrice = value;
_recRetailPrice = GetRetailFromWholesale(_wholesalePrice);
_cost = GetCostFromWholesale(_wholesalePrice);
}
}
public decimal RecRetailPrice
{
get => _recRetailPrice;
set
{
_recRetailPrice = value;
_wholesalePrice = GetWholesaleFromRetail(_recRetailPrice);
_cost = GetCostFromWholesale(_wholesalePrice);
}
}
private decimal GetWholesaleFromRetail(decimal amount)
{
return amount * (decimal)( (1 - 0.23f) / (1 + 0.15f) * StockUom);
}
private decimal GetRetailFromWholesale(decimal amount)
{
return amount / (decimal)( (1 - 0.23f) / (1 + 0.15f) * StockUom);
}
private decimal GetCostFromWholesale(decimal amount)
{
return (amount - Levy) / (decimal)((1 + AdjPercentage) * (1 - Margin)) - Transport - RoyaltyMarket - DelStrand;
}
private decimal GetWholesaleFromCost(decimal amount)
{
return ((amount + Transport + RoyaltyMarket + DelStrand) / (decimal)((1 - Margin) * (1 + AdjPercentage))) + Levy;
}
public float AdjPercentage { get; }
public float Margin { get; }
public decimal RoyaltyMarket { get; }
public decimal Transport { get; }
public decimal DelStrand { get; }
public float StockUom { get; }
public decimal Levy { get; }
}