C#Double不受Math.Round的影响 - 为什么?

时间:2011-10-20 11:16:31

标签: c#

我现在有这段代码:

 totalCost = fuelPrice * purchaseVolume;
 totalCost = Math.Round(totalCost, 2);
 Console.WriteLine("Total Cost = £" + totalCost);

如果燃油价格为1.15且成交量为2,那么console.writeline则显示总成本为2.3英镑,而不是我想要达到的2.30。我做错了什么?

6 个答案:

答案 0 :(得分:6)

你是四舍五入,而不是格式化: - )

您不需要Math.Round,您需要:

Console.WriteLine("Total Cost = £ {0:F2}", totalCost);

您可以通过以下方式查看它:计算机以某些格式表示内部数字。这些格式通常是二进制格式,并且不仅仅是“凡人”的​​“易于理解”。 double是这些格式之一。它是固定长度格式,因此每个double长度为8个字节。当你想在某个地方打印它时,你必须“字符串化”它(将其转换为人类可以理解的格式)。在C#/ .NET中,这通常使用所有对象都具有的ToString()方法完成。

现在,在double 1.0 == 1.00 == 1.额外的零没有保存(因为它们通常不重要)

Math.Round“生成”具有最​​大小数位数的double(我们将忽略double的变幻莫测)。所以Math.Round(1.222, 2) == 1.22,但Math.Round(1.0, 2) == 1 因此,Math.Rounddouble返回double的函数。

Console.WriteLine有所不同。在这种情况下,它需要doublestring ify(并将其显示在控制台屏幕上)。当你对一个数字进行字符串化并告诉Console.WriteLine你想在.之后需要2位小数时,它将显示2位小数,即使小数为零也是如此。因此Console.WriteLine("{0:F2}", 1)将打印1.00。可能Console.WriteLine使用ToString的{​​{1}}方法来执行此操作。事实上,分析double的{​​{1}}方法会更好,因为ToString内部可能与double非常相似

我忘记了。正如AVD在对你的帖子的评论中告诉你的那样。 Console.WriteLine("Total Cost = £ {0:F2}", totalCost)Console.WriteLine("Total Cost = £ {0}", totalCost.ToString("F2"));可能是信息技术最大的罪恶之一。

答案 1 :(得分:4)

重点是,如果你将2.3翻到第二位,你仍然得到2.3
换句话说,2.30和2.3是相同的数字。

您需要的是

Console.WriteLine("Total Cost = £{0:F2}", totalCost);

查看此文章:.NET Format String 101

答案 2 :(得分:3)

您必须调用totalCost.ToString(“format”)。看here

答案 3 :(得分:3)

在逗号使用此命令后显示两位数字:

Console.WriteLine(String.Format("Total Cost = £ {0}", totalCost.ToString("n2")));

我认为在这种情况下,Math.Round不是您所需要的。

答案 4 :(得分:3)

您需要格式化数字以在小数部分上获得尾随零,例如:

Console.WriteLine(string.Format( "Total Cost = £{0:F2}", totalCost) );

答案 5 :(得分:3)

您描述的案例不是四舍五入,而是格式化问题。如果你这样做:

Console.WriteLine(string.Format("Total Cost = {0:c}" , totalCost)) 

您可能会得到您想要的内容,包括根据区域设置放置适当的货币符号