2011-10-20 145 views
3

我有这段代码的时刻: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,因为我想实现。我究竟做错了什么?

+1

使用十进制类型货币计算 - http://stackoverflow.com/questions/1165761/decimal-vs-double-which-一个应该我使用和 - 当 – adatapost

回答

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是不同的。在这种情况下,它需要一个doublestring ify(并将其显示到控制台屏幕)。当您对一个数字进行字符串化并告知Console.WriteLine.之后需要2位小数时,即使小数点为零,它也会显示2位小数。因此Console.WriteLine("{0:F2}", 1)将打印1.00。可能Console.WriteLine使用ToString方法double来做到这一点。所以说实话,这将是更好的分析doubleToString方法,因为Console.WriteLine("Total Cost = £ {0:F2}", totalCost)可能是非常相似的内部,以Console.WriteLine("Total Cost = £ {0}", totalCost.ToString("F2"));

我几乎忘了。像AVD一样在你对帖子的评论中告诉你。 floatdouble可能是信息技术最大的两个弊端。

+0

啊我正确地看到,当然,虽然Math.Round方法应该工作? –

+0

@ HTTP404一件事是如何在内存中表示一个数字(例如双倍),另一件事是它如何显示在屏幕上。在屏幕上它是一个“字符串”。因此,通过'Math.Round',你可以得到一个“记忆”数字,最大值为**一定数量的数字(但是请记住,在计算机中,1.00 == 1.0 == 1并保存为1(我们将无视内存中如何保存双打))。但要格式化(将其“格式化”),必须将格式指定为“Console.WriteLine”(或“ToString()”方法) – xanatos

3

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

3

显示两个数字的逗号使用此命令后:

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

我觉得Math.Round是不是你在这种情况下所需要的。

+0

该循环仍需要强制该数量为是有收费的(例如每公升1.319英镑,1公升应收1.32英镑 - 格式字符串不会为你舍入)。 –

3

您需要格式化号码,让他们在小数部分尾随零,例如:

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

您所描述的情况是不是四舍五入的问题,但格式的问题。如果你这样做:

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

你可能会得到你想要的,包括将取决于区域设置适当的货币符号什么

4

的一点是,如果你轮2.3的第二个数字,你仍然可以得到2.3
否则,2.30和2.3是相同的数字。

你需要的是

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

检查这篇文章:.NET Format String 101

相关问题