将十进制分割为元素计数

时间:2014-04-15 14:33:47

标签: c# wpf split decimal

List<myType>DataTemplate绑定了属性:

public int pID { get; set; }
public string NamePar { get; set; }
public decimal Count { get; set; }

也是文本框,用户可以在其中输入十进制数或从权重中读取它。 我正在寻找解决方案来分割产品计数的输入小数,例如:

TextBox从weight获得16.700值,productCount = 3,split为:

[1] 5.56

[2] 5.56

[3] 5.58

另一个例子91/3

[1] 30.3

[2] 30.3

[3] 30.4

知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

您可以通过检查项目是否是列表中的最后一项,或者它是否为初始N-1项目之一来计算结果。

  • 当它是最初的N-1项之一时,请使用Math.Truncate(100*Weight/Count)/100
  • 如果是最后一项,请使用Weight - ((Count-1) * Math.Truncate(100*Weight/Count) / 100)

这背后的逻辑很简单:当它是一个初始数字时,截断分割的结果;通过从总权重中减去截断值的总和来计算最后一个数字。

这种方法在小数点后产生两个数字,所以你的第二个例子看起来像

30.33
30.33
30.34

答案 1 :(得分:0)

将剩余部分放在最后一项:

public List<decimal> Allocate(decimal input, int items, int precision)
{
   decimal scale = (decimal)Math.Pow(10,precision);
   decimal split = Math.Truncate((input / items)*scale) / scale;
   List<decimal> output = Enumerable.Repeat(split, items).ToList();

   decimal remainder = input - output.Sum();
   output[output.Count - 1] += remainder;

   return output;
}

虽然舍入似乎是一种更准确的方法 - 如果你有几个项目,你可能会产生大量的截断错误:

public List<decimal> Allocate(decimal input, int items, int precision)
{
   decimal split = Math.Round((input / items), precision);
   List<decimal> output = Enumerable.Repeat(split, items).ToList();

   decimal remainder = input - output.Sum();
   output[output.Count - 1] += remainder;

   return output;
}