C#高手们,你们能解释这是什么现象吗?

CsLover 2003-04-23 10:02:26
一段代码
float a=0.2178f;
float b=0.33f;
Console.WriteLine(a/b);
if(a/b==0.66f)
Console.WriteLine("1");
else
Console.WriteLine("0");

大家看看 目测一下结果 然后上机试试 检验一下你的预测
最重要的是问一下高手 为什么会这样?
...全文
37 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuwen16 2003-04-24
  • 打赏
  • 举报
回复
果然姜还是老的辣,呵呵
tyh800220 2003-04-24
  • 打赏
  • 举报
回复
崇拜saucer(思归, MS .NET MVP)
greenclass 2003-04-24
  • 打赏
  • 举报
回复
思归的方法是完全正确的
Knight94 2003-04-24
  • 打赏
  • 举报
回复
精度不一样
jlhdlj 2003-04-24
  • 打赏
  • 举报
回复
思归的方法是完全正确的,这种方法在C的入门书里就开始使用了!
pdsinfo 2003-04-23
  • 打赏
  • 举报
回复
呵呵,这是浮点数的存贮有误差引起的
“Console.WriteLine(a/b);”这一句之所以输出0.66是因为计算结果在ToString()的时候被近似作了0.66(恰巧在这里无误差)
(a/b==0.66f)之所以为false也是因为存储误差(其实还有计算误差和舍入时的精度误差,比如计算机认为1.0/3.0=0.3333333)引起的
所以,强烈建议不要“比较两个浮点数相等”——这是非常不可靠的!!

有例如 if(0.618f/1.414f*0.707f==0.500f)Console.WriteLine("equal");
else Console.WriteLine("not equal");
就输出 "not equal"

还有if(9E-400==0)Console.WriteLine("wrong");输出“wrong”
renchao 2003-04-23
  • 打赏
  • 举报
回复
这是机器运算精度误差造成的
一般可设一个容差闵值eps,让他们之差的绝对值在eps内就认为他们相等。
贝贝壳壳 2003-04-23
  • 打赏
  • 举报
回复
计算浮点数的时候有误差
只要误差控制在一定范围内即可,

而==则是完全比较。
甴曱 2003-04-23
  • 打赏
  • 举报
回复
你把代码改为:
float a=float.Parse((0.2178).ToString());
float b=float.Parse((0.33).ToString());
Console.WriteLine(a/b);
if(float.Parse(Convert.ToString(a/b))==float.Parse((0.66).ToString()))
Console.WriteLine("1");
else
Console.WriteLine("0");
这一个程序才正确,具体原因我现在也没有弄明白。
Soking 2003-04-23
  • 打赏
  • 举报
回复
好的结局方法是像思归说的用一个小于一定精度的数来代替0!
Soking 2003-04-23
  • 打赏
  • 举报
回复
机器的浮点运算不像我们人计算的,二进制计算除法会存在误差!
张新林 2003-04-23
  • 打赏
  • 举报
回复
up
saucer 2003-04-23
  • 打赏
  • 举报
回复
it is a bad idea to use "==" with floating numbers, try

if(Math.Abs(a/b - 0.66f) < 0.0001)
{

}
else
{

}

110,536

社区成员

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

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

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