价格除以3

时间:2014-02-20 16:40:15

标签: c# math numbers

对于会计程序,我需要将价格除以3,以便可以在3个月内共享

例如9€

  • 第一个月3€
  • 第二个月3€
  • 3€第三个月

现在这将是价格/ 3

但如果数字是10呢?

  • 第一个月3,33€
  • 第二个月3,33€
  • 上个月3,33€

3,33€* 3 =€9.99

一分钱已经失踪。 我怎样才能使它成为3,33€,3,33€,3,34€?

4 个答案:

答案 0 :(得分:15)

你需要向会计师询问他们在这里想要什么。这在软件开发中是一件很重要的事情:询问用户。

通常,为了稳定,您将从余额账户中减去支付的金额,并将支票放入以确保余额降至零。

在构建会计软件时,不要永远使用浮点数据类型。浮点精度会咬你。改为使用货币类型。

答案 1 :(得分:11)

您可以通过弥补差异来设置最后一个,而不是通过与其余部分相同的计算。在伪代码中:

normalMonthPrice = RoundToTwoPlaces(totalPrice / months);
lastMonthPrice = totalPrice - (normalMonthPrice * (months - 1));

答案 2 :(得分:5)

正如芭丝谢芭所说,先问问你的用户。

这是我在这种情况下经常使用的技术。这种方法将确保最均匀的分布,向上偏向末端。例如,如果您致电DivvyUp(101, 3),则会获得33.66, 33.67, 33.67。请注意,差异不仅仅是在最后弥补。相反,每个值都是根据剩下的内容计算的,而不是从开始时计算的。

public static double[] DivvyUp(double total, uint count)
{
    var parts = new double[count];
    for (var i = 0; i < count; ++i)
    {
        var part = Math.Truncate((100d * total) / (count - i)) / 100d;
        parts[i] = part;
        total -= part;
    }
    return parts;
}

答案 3 :(得分:3)

恭喜你,你已经发现为什么计算世界不像“把数学放在它上面”那么简单 -

最简单的解决方案是除以3,舍入到小数点后两位,并在前两个月使用该值,其余时间使用original - 2 * perMonth