【问题标题】:Properly round financial data适当地舍入财务数据
【发布时间】:2012-04-01 11:32:11
【问题描述】:

我决定重新提出我的问题:

decimal dTotal = 0m;
foreach (DictionaryEntry item in _totals)
    {
        if (!string.IsNullOrEmpty(item.Value.ToString()))
        {
            dTotal += Convert.ToDecimal(item.Value);
        }
    }
    Console.WriteLine(dTotal / 3600m);
    Console.WriteLine(decimal.Round(dTotal / 3600m, 2));
    Console.WriteLine(decimal.Divide(dTotal, 3600m));

以上代码返回:

579.99722222222222222222222222

580.00

579.99722222222222222222222222

所以,这就是我的问题所在,我真的需要它来显示579.99;但是任何一轮,无论是decimal.Round 还是Math.Round 仍然返回580;甚至{0:F} 的字符串格式也返回580.00

我怎样才能正确地做到这一点?

【问题讨论】:

标签: c# winforms math financial


【解决方案1】:

新答案(新问题)

好的,所以您的值为579.99722222222222222222222222 - 您要求将其四舍五入到小数点后两位。 580.00 不是自然的答案吗?它比 579.99 更接近原始值。听起来您本质上想要 flooring 行为,但具有给定的位数。为此,您可以使用:

var floored = Math.Floor(original * 100) / 100;

在这种情况下,您可以一步完成:

var hours = Math.Floor(dTotal / 36) / 100;

...相当于

var hours = Math.Floor((dTotal / 3600) * 100) / 100;

原始答案(原始问题)

听起来您的 payTotal 开头可能不合适:

using System;

class Test
{
    static void Main()
    {
        decimal pay = 2087975.7m;
        decimal time = pay / 3600;
        Console.WriteLine(time); // Prints 579.99325
    }
}

这就是问题所在:

var payTotal = 2087975.7;

这是将payTotal 分配给double 变量。你实际得到的值是 2087975.69999999995343387126922607421875,这不是你想要的。每当您发现自己从double 转换为decimal 或反之亦然时,您应该担心:您可能在某处使用了错误的类型。货币值绝对应该存储在 decimal 而不是 double 中(还有各种其他 Stack Overflow 问题讨论何时使用哪个)。

有关更多信息,请参阅我关于浮点的两篇文章:

(一旦你得到正确的结果,格式化它们当然是另一回事,但这应该不会太糟糕......)

【讨论】:

  • @zackrspv:如我所见,值是 2087990...这是你第一次提到dTotal。我给出了一个简短但完整的程序,显示计算工作。你能给出一个类似的 not 工作吗?
  • @zackrspv:完全改变问题对我来说违背了网站的精神——它使任何现有的答案看起来完全错误。碰巧我会改变我的答案,但将来我建议将问题编辑为 include 旧问题。 (至少你已经承认它是“重新创建的”。)
  • @zackrspv:不,你应该学会设计出简短但完整的程序来演示相同的问题,但不使用任何专有的东西。在这种情况下,它特别容易做到。顺便说一句,我已经更新了我的答案。
  • @zackrspv:已回滚您的编辑 - 现在我已回答已编辑的问题,您不妨将其留在那里...否则您浪费了我的时间两次
猜你喜欢
  • 2017-12-08
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 2015-02-16
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多