社区
C++ Builder
帖子详情
高手接招:如何使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
打赏
收藏
高手接招:如何使202.2-200=2.2而不是2.19999999999999999?
C++Builder和Delphi的浮点数运算有时真让人气得半死。 比如: ShowMessage(FloatToStr(202.2-200)); 打印出的结果不是2.2而是2.1999999999999999999999999 也不知编译器做了什么优化,得出这个鬼答案。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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);
作用域插槽 scope.row.status 显示v-if选择其中一个
根据后端返回的值用 v-if选择其中的一个 比如:0代表成功 1:代表失败 2:退款中 用作用域插槽 <template slot-scope="scope"> <span v-if="scope.row.status===0">成功</span> <span v-if="scope.row.status===1">失败</span> <span v-if="
Unable to correct problems, you have held broken packages.安装应用出现版本冲突问题
安装应用出现版本冲突问题(以安装vim为例) The following packages have unmet dependencies: vim : Depends: vim-common (= 2:8.0.0197-4+deb9u3) but 2:8.1.0875-5 is to be installed E: Unable to correct problems, you have held broken packages. 原因分析 # 需要安装的安装包所需的依赖和已经安装的依赖版本不一致,冲
spring-cloud-Hoxton.SR6 (springBoot
2.2
.x-2.3.x)学习篇(一)
spring-cloud-Hoxton.SR6 (springBoot
2.2
.x-2.3.x)学习篇(一) cloud版本: Hoxton.SR6 boot版本:
2.2
.x-2.3.x 目前cloud官网最新的版本为Hoxton.SR6 (基于boot 2.3.x构建) 1.什么是微服务 官网: https://www.martinfowler.com/articles/microservices.html 官方定义:微服务就是由一系列围绕自己业务开发的微小服务构成,他们独立部署运行在自己的进程里,基于
Spring注解context:component-scan base-package使用
小王:想要把一个bean交给Spring去管理,你想怎么做! 小李:简单啊,在Spring的配置文件里面配置<bean id="" class=""></bean>不就行了。 小王:不行啊,我们的项目太恶心了,用了一万个bean,写配置文件快累死了,密密麻麻的看不清楚 小李:额!这个也太奇葩了,怎么办,翻翻书吧,有没有好方法。 这是什么?自动装配?我擦,这么神奇?下面我们...
Error: Package: mysql-community-server-5.6.47-2.el7.x86_64 (mysql56-community) Requires:
Package mysql-server is obsoleted by mysql-community-server, trying to install mysql-community-server-5.6.47-2.el7.x86_64 instead Resolving Dependencies --> Running transaction check --->...
C++ Builder
13,873
社区成员
102,696
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章