高手接招:如何使202.2-200=2.2而不是2.19999999999999999?

superyys 2002-12-29 01:00:25
C++Builder和Delphi的浮点数运算有时真让人气得半死。
比如: ShowMessage(FloatToStr(202.2-200));
打印出的结果不是2.2而是2.1999999999999999999999999
也不知编译器做了什么优化,得出这个鬼答案。
...全文
109 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
warton 2002-12-29
  • 打赏
  • 举报
回复
同意whyjld及pazee(耙子)说的!!
网事随逢 2002-12-29
  • 打赏
  • 举报
回复
好好学习,天天向上
痞子酷 2002-12-29
  • 打赏
  • 举报
回复
pazee(耙子) ( ) 信誉:127 2002-12-29 13:54:00 得分:0


这个不需要高手回答,大学的计算机导论、组成原理、计算机算法课程都该讲过。

看你的问题你不可能学过.

abs(a-b - c) < 0.00001

===>
fabs(a-b-c)<0.0000001


抬头看路 2002-12-29
  • 打赏
  • 举报
回复
FloatToStr会进行格式转换
类似于:
AnsiString Num;
Num.sprintf("%1.2f", 212.2 - 200);
ShowMessage(Num);
会进行类似四舍五入的处理。
VC的到的数字也是不精确的,不管你用什么编译器,只要用x86的浮点单元,结果都是一样,就看输出的方式。
如果你要绝对正确的答案,你只有自己写函数利用整数单元计算。
snowedforest 2002-12-29
  • 打赏
  • 举报
回复
Delphi:Format();
BCB: AnsiString::Format();
superyys 2002-12-29
  • 打赏
  • 举报
回复
我也是计算机本科毕业的,,当然学过了。
不过真的很奇怪。。
ShowMessage(FloatToStr(212.2-200));
打印出来的就是12.2,而不是12.1999999999999999999999,
真是不可思议。。。。
耙子 2002-12-29
  • 打赏
  • 举报
回复
这个不需要高手回答,大学的计算机导论、组成原理、计算机算法课程都该讲过。

看你的问题你不可能学过.

abs(a-b - c) < 0.00001
riverboat 2002-12-29
  • 打赏
  • 举报
回复
gz
superyys 2002-12-29
  • 打赏
  • 举报
回复
高手还不少哦。。。这些我也学过。。。
可是如果这个相减的结果的数如果大于10或小于-10时却算得很准确。。。。
真是奇怪。。。。
这又怎么解释???
耙子 2002-12-29
  • 打赏
  • 举报
回复
为了解决浮点数的问题,在需要高精度地方可以采用以下几个办法。

1.采用高精度,降低误差;
2.采用定点数,保证精度;
3.采用BCD编码。
耙子 2002-12-29
  • 打赏
  • 举报
回复
不用试,只要是浮点数就存在精度问题。

1.浮点数存在精度问题;精度有限
2.10进制小数转二进制小数的时候存在精度问题,10进制的0.1在二进制里面是无限循环小数,就是说 0.1 => 2进制 => 10进制 一定存在误差,这是合理的。
3.浮点数的比较一般不用等于,而用作差,当绝对值小于允许的精度就认为相等。
比如 a-b = c 一般写成 a-b - c < 0.00001 (0.00001是允许的误差)。

多看些理论的书,打好基础,别急急忙忙的写代码,会用一个工具不等于能写出来好东西。
superyys 2002-12-29
  • 打赏
  • 举报
回复
可是VC的编译器可以避免这个问题。。
真的。。。。
不信你们可以试试。。
zliang2000 2002-12-29
  • 打赏
  • 举报
回复
同意把子的话!!
耙子 2002-12-29
  • 打赏
  • 举报
回复
楼主 说这话只能说明你没有起码的常识,这个可不是delphi的问题。

你找本书看看 浮点书的表示方法再说话。
kingfish 2002-12-29
  • 打赏
  • 举报
回复
AnsiString s=FloatToStrF(202.2-200,ffNumber,15,2);
ShowMessage(s);

13,873

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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