我有这段代码的时刻:C#Double不受Math.Round影响 - 为什么?
totalCost = fuelPrice * purchaseVolume;
totalCost = Math.Round(totalCost, 2);
Console.WriteLine("Total Cost = £" + totalCost);
如果燃料价格是1.15,体积为2,console.writeline
然后显示总成本为2.3£,不是2.30,因为我想实现。我究竟做错了什么?
我有这段代码的时刻:C#Double不受Math.Round影响 - 为什么?
totalCost = fuelPrice * purchaseVolume;
totalCost = Math.Round(totalCost, 2);
Console.WriteLine("Total Cost = £" + totalCost);
如果燃料价格是1.15,体积为2,console.writeline
然后显示总成本为2.3£,不是2.30,因为我想实现。我究竟做错了什么?
那你是四舍五入,不格式化:-)
你不需要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
方法double
来做到这一点。所以说实话,这将是更好的分析double
的ToString
方法,因为Console.WriteLine("Total Cost = £ {0:F2}", totalCost)
可能是非常相似的内部,以Console.WriteLine("Total Cost = £ {0}", totalCost.ToString("F2"));
我几乎忘了。像AVD一样在你对帖子的评论中告诉你。 float
和double
可能是信息技术最大的两个弊端。
啊我正确地看到,当然,虽然Math.Round方法应该工作? –
@ HTTP404一件事是如何在内存中表示一个数字(例如双倍),另一件事是它如何显示在屏幕上。在屏幕上它是一个“字符串”。因此,通过'Math.Round',你可以得到一个“记忆”数字,最大值为**一定数量的数字(但是请记住,在计算机中,1.00 == 1.0 == 1并保存为1(我们将无视内存中如何保存双打))。但要格式化(将其“格式化”),必须将格式指定为“Console.WriteLine”(或“ToString()”方法) – xanatos
您必须调用totalCost.ToString(“format”)。看here
显示两个数字的逗号使用此命令后:
Console.WriteLine(String.Format("Total Cost = £ {0}", totalCost.ToString("n2")));
我觉得Math.Round是不是你在这种情况下所需要的。
该循环仍需要强制该数量为是有收费的(例如每公升1.319英镑,1公升应收1.32英镑 - 格式字符串不会为你舍入)。 –
您需要格式化号码,让他们在小数部分尾随零,例如:
Console.WriteLine(string.Format("Total Cost = £{0:F2}", totalCost));
您所描述的情况是不是四舍五入的问题,但格式的问题。如果你这样做:
Console.WriteLine(string.Format("Total Cost = {0:c}" , totalCost))
你可能会得到你想要的,包括将取决于区域设置适当的货币符号什么
的一点是,如果你轮2.3的第二个数字,你仍然可以得到2.3
否则,2.30和2.3是相同的数字。
你需要的是
Console.WriteLine("Total Cost = £{0:F2}", totalCost);
检查这篇文章:.NET Format String 101
使用十进制类型货币计算 - http://stackoverflow.com/questions/1165761/decimal-vs-double-which-一个应该我使用和 - 当 – adatapost