加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:52:52 所属栏目:百科 来源:网络整理
导读:我现在有这段代码: 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在对你的帖子的评论中告诉你的那样.浮动和双重可能是信息技术最大的两个邪恶.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读