【问题标题】:How to add point precision to decimal in C#?如何在 C# 中将点精度添加到小数点?
【发布时间】:2014-10-08 10:08:04
【问题描述】:

我想知道如何将点精度添加到十进制。我做了一个小程序来计算工人的每周工资,但在某些情况下,当结果像 145.60 美元时,它显示为 145.6 美元,但我希望程序显示结果为 145.60 美元。

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int hours;
            decimal total;
                Console.Write("Total working hours: ");
                hours = int.Parse(Console.ReadLine());
                total = Convert.ToDecimal(hours * 7.50);
                if (hours > 40)
                total = total + Convert.ToDecimal((hours - 40) * 3.75);
                Console.WriteLine("Total weekly pay is $" + total + ".");
                Console.ReadLine();
        }
    }
}

【问题讨论】:

  • Console.WriteLine("Total weekly pay is ${0:N2}.", total);

标签: c# .net decimal floating-point-precision


【解决方案1】:

首先,修复这条线和类似的线:

total = Convert.ToDecimal(hours * 7.50);

在这种特殊情况下,这不太可能成为问题,但您应该尽量避免混淆doubledecimal。你可以使用:

decimal total = hours * 7.5m;

同样:

if (hours > 40)
{
    total += (hours - 40) * 3.75m;
}

接下来,为了格式化小数点,您可以将整个 Console.WriteLine 转换为使用格式字符串 - 这样可以避免难看的字符串连接 - 并在格式说明符中指定位数:

Console.WriteLine("Total weekly pay is ${0:0.00}.", total);

0.00custom numeric format string,它强制要求小数点前至少有一位数字,并且小数点后总是正好两位。在你的情况下,无论如何都不会超过两个,但如果你的加班时间变成 3.755,例如,它会四舍五入。您必须检查它是否以您想要的方式舍入 - 您可能想要明确地舍入它。

如 cmets 中所述,如果需要,您可以改用 N2 standard numeric format string。当工资超过 1000 美元时,它们会给出不同的行为 - N2 会给你分组分隔符(例如 1,234.56 美元),而 0.00 不会。

要考虑的另一种替代方法是删除 $ 的硬编码并使用 c 标准数字格式来表示货币:

Console.WriteLine("Total weekly pay is {0:c}.", total);

这将使用当前文化的默认方式来表示货币。当然,这意味着您必须首先使用正确的文化 - 我是英国用户,所以在我的机器上它使用 £ 而不是 $...但如果您知道文化适合两者文本和货币,这可能是最干净的方法。

【讨论】:

  • 有什么理由使用0.00 格式字符串而不是N2(组分隔符除外)?
  • @DavidG:不是特别 - 我发现思考和识别更简单,但两者都可以。会提到这一点。
  • 很高兴不只是我!我一直更喜欢明确而不是必须记住 N/F/G/etc,但如果我这样做的话,我会觉得我忽略了一个框架结构。
  • 非常感谢您的精心回复。它不仅解决了我的问题,还丰富了我的知识。我将尝试遵循您在回复中所述的约定,并尝试构建更合适的代码。
  • @DavidG: :) 当然,c 格式可能更合适 - 请参阅我的编辑。
【解决方案2】:

使用字符串格式化来格式化输出

 Console.WriteLine("Total weekly pay is $ {0:N2} .",total);

Check this link

【讨论】:

    【解决方案3】:

    这会有所帮助:

    decimal d = Convert.ToDecimal(3.10);
    Console.WriteLine(d.ToString("#.00"));
    

    结果将是3.10

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      相关资源
      最近更新 更多