如何在C#中将点精度添加到十进制?

时间:2014-10-08 10:08:04

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

我想知道如何将点精度添加到十进制。我做了一个小程序计算工人的每周工资,但在某些情况下,当结果是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();
        }
    }
}

3 个答案:

答案 0 :(得分:4)

首先,修复此行和类似的行:

total = Convert.ToDecimal(hours * 7.50);

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

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.00是一个custom numeric format string,它强制始终在小数点前至少有一位数,并且在小数点后总是完全 2。在你的情况下,反正永远不会超过两个,但如果你的加班时间变成3.755,它就会变圆。你必须检查它是否按照你想要的方式进行四舍五入 - 你可能想要明确地将它四舍五入。

如评论中所述,如果您愿意,可以使用N2 standard numeric format string代替。当工资超过1000美元时,他们会给出不同的行为 - N2会为您提供分组分隔符(例如$ 1,234.56),而0.00则不会。

另一个需要考虑的选择是删除$的硬编码并使用c标准数字格式,用于货币:

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

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

答案 1 :(得分:0)

这会有所帮助:

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

结果将是3.10

答案 2 :(得分:0)

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

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

Check this link