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

C#Double不受Math.Round的影响 – 为什么?,第1张

概述我现在有这段代码: totalCost = fuelPrice * purchaseVolume; totalCost = Math.Round(totalCost, 2); Console.WriteLine("Total Cost = £" + totalCost); 如果燃油价格为1.15且油量为2,则console.writeline将显示总成本为2.3英镑,而不是2.30,因为我正在 我现在有这段代码:

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是这些格式之一.它是固定长度的格式,因此每个双倍长度为8个字节.当你想在某个地方打印它时,你必须“字符串化”它(将其转换为人类可以理解的格式).在C#/ .NET中,这通常使用所有对象都具有的ToString()方法来完成.

现在,在一个双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并对其进行字符串化(并将其显示在控制台屏幕上).当你对一个数字进行字符串化并告诉Console.Writeline你想在.之后需要2位小数时,它将显示2位小数,即使小数为零也是如此.所以Console.Writeline(“{0:F2}”,1)将打印1.00.可能Console.Writeline使用double的ToString方法来执行它.所以实际上,分析Double的ToString方法会更好,因为Console.Writeline(“总成本=£{0:F2}”,totalCost)可能在内部与Console.Writeline非常相似(“总成本=£ {0}“,totalCost.ToString(”F2“));

我忘记了.正如AVD在对你的帖子的评论中告诉你的那样.浮动和双重可能是信息技术最大的两个邪恶.

总结

以上是内存溢出为你收集整理的C#Double不受Math.Round的影响 – 为什么?全部内容,希望文章能够帮你解决C#Double不受Math.Round的影响 – 为什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1223537.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存