我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
等
知道如何解决这个问题吗?
答案 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;
}