我现在有这段代码:
totalCost = fuelPrice * purchaseVolume;
totalCost = Math.Round(totalCost, 2);
Console.WriteLine("Total Cost = £" + totalCost);
如果燃油价格为1.15且成交量为2,那么console.writeline
则显示总成本为2.3英镑,而不是我想要达到的2.30。我做错了什么?
答案 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.Round
是double
返回double
的函数。
Console.WriteLine
有所不同。在这种情况下,它需要double
和string
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))
您可能会得到您想要的内容,包括根据区域设置放置适当的货币符号