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

dev*_*__c 3 c#

我现在有这段代码:

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

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

xan*_*tos 6

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

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

Console.WriteLine("Total Cost = £ {0:F2}", totalCost);
Run Code Online (Sandbox Code Playgroud)

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

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

Math.Round"生成" double具有最大小数位数的a(我们将忽略变幻莫测double).所以Math.Round(1.222, 2) == 1.22,但Math.Round(1.0, 2) == 1 因此Math.Round是一个函数,从double返回double.

Console.WriteLine是不同的东西.在这种情况下,它需要a doublestringify(并将其显示在控制台屏幕上).当你对一个数字进行字符串化并告诉Console.WriteLine它你想要2位小数后.,它将显示2位小数,即使小数为零也是如此.所以Console.WriteLine("{0:F2}", 1)将打印1.00.可能Console.WriteLine使用这种ToString方法double.所以实际上,分析ToString方法会更好double,因为Console.WriteLine("Total Cost = £ {0:F2}", totalCost)内部可能非常相似Console.WriteLine("Total Cost = £ {0}", totalCost.ToString("F2"));

我忘记了.正如AVD在对你的帖子的评论中告诉你的那样.float并且double可能是信息技术最大的两个弊端.