计算结果多一位或少一位小数

问题描述 投票:0回答:1

我有一个允许用户编辑价格的对话框。现在您可以输入成本价,它会计算出批发价和零售价,或者您可以输入批发价,它会计算出零售价和成本价,或者您可以输入零售价,它会计算出批发价和成本价。我一直使用 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 并以任何可能的组合更改计算,但没有结果

c# decimal rounding
1个回答
0
投票

所有计算都归结为两个函数及其反函数

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; }
}
© www.soinside.com 2019 - 2024. All rights reserved.