数值精度与数值转换的问题

bambuz 2012-02-18 10:02:20
在做项目时,被一个没有重视的数值转换的问题折腾了一下. 特别提出来, 给大家一个提醒.

下面的示例结果和和你所想的是一样的吗?

static void Main(string[] args)
{
float f = 0.2f;
double d = 0.2d;
Console.WriteLine(10 * (int)(2 / f));
Console.WriteLine(10 * (int)(2 / d));
Console.ReadKey();
}


...全文
121 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
心存侥幸,就要用测试来验证。没有高强度的测试支持,其实我们的理论概念都站不住脚。
bambuz 2012-02-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sp1234 的回复:]
能写出

C# code

(int)(2 / d)

这种代码,其逻辑也很奇怪。楼主纯粹是心存侥幸,以为1.99999999999999999999999转换为int也是2么?
[/Quote]

是呀, 是有点想当然. 所以, 还是这样处理比较严谨一些:
Console.WriteLine(10 * (int)Math.Round((2 / f)));

另外, 在排错的过程中发现 debug 版和 release 版的得出的结果是不一样的.
  • 打赏
  • 举报
回复
能写出
(int)(2 / d)

这种代码,其逻辑也很奇怪。楼主纯粹是心存侥幸,以为1.99999999999999999999999转换为int也是2么?
threenewbee 2012-02-18
  • 打赏
  • 举报
回复
嗯,意识到这个问题很好。

所以,千万不要用等号比较浮点数,而应该相减取绝对值,比较是否小于一个极小的数。

110,529

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧