MFC中怪异的float精度问题

qingcheng116 2012-10-14 10:23:43
我在C++中这样定义了一个float变量
float v = 1.15;

断点调试的时候就变成了1.1499999,有时候又变成1.1500001;





换成double或者在用 float v = 1.15f;都是类似情况。

请问各位大神有没有遇到这个问题,该如何解决?
谢谢!


环境:Win7 x86 32位
IDE:Visual Studio 2008 TFS
语言:C++ MFC
...全文
499 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
j8daxue 2012-10-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
引用 3 楼 的回复:
float v = 1.15;

这行的意思是请编译器给你一个IEEE单精度浮点编码所能表示的最接近实数 1.15 的浮点数

请思考,double也不过8字节,而实数的数量是无限的

你不能幻想有限的比特能表达无限的信息


那为什么有时候出现1.1500001,有时候又是1.149999?

因为要用BCD码表示个位、十分位、百分位,我用int ……
[/Quote]
你自己分别是float和double,精度不一样,凑的接近值不同。何来一会4一会5之说
赵4老师 2012-10-15
  • 打赏
  • 举报
回复
用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10)
同理,用二进制小数也不能精确表示某些10进制小数。
qingcheng116 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
有时候是什么意思?

double和float表示的有区别是正常的

如果同样是float,有时是5,有时是4,就有点奇怪了

建议转成字符串再处理


C/C++ code
int main()
{
char buf[10]={0};
float f=1.15f;
sprintf(buf,"%.5f",f);

// 再从buf中提……
[/Quote]

对了,如果f的位数和小数点位置不固定,怎么判断各位在什么地方?
是用for遍历小数点在什么位置吗?


怎么现在CSDN把编辑自己的回复都搞得没有权限了!
yuyeshijie 2012-10-15
  • 打赏
  • 举报
回复
浮点数十有一定的浮动的,也就是说
float a ,b;
要判断 a 是不是等于b 不一定就是完全相等。
就算要判断一个浮点数等不等于0 都要按照下面来比较
const float EPSINON = 0.00001;
float x;
判断x是否等于0
if (( x >= - EPSINON) && (x <= EPSINON) )
比较两个数是否相等也类似。
qingcheng116 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
有时候是什么意思?

double和float表示的有区别是正常的

如果同样是float,有时是5,有时是4,就有点奇怪了

建议转成字符串再处理


C/C++ code
int main()
{
char buf[10]={0};
float f=1.15f;
sprintf(buf,"%.5f",f);

// 再从buf中提……
[/Quote]

编译的时候,打印出来的值不是固定的。

我试试你这个
yisikaipu 2012-10-15
  • 打赏
  • 举报
回复
有时候是什么意思?

double和float表示的有区别是正常的

如果同样是float,有时是5,有时是4,就有点奇怪了

建议转成字符串再处理

int main()
{
char buf[10]={0};
float f=1.15f;
sprintf(buf,"%.5f",f);

// 再从buf中提取各个位

return 0;
}
qingcheng116 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
float v = 1.15;

这行的意思是请编译器给你一个IEEE单精度浮点编码所能表示的最接近实数 1.15 的浮点数

请思考,double也不过8字节,而实数的数量是无限的

你不能幻想有限的比特能表达无限的信息
[/Quote]

那为什么有时候出现1.1500001,有时候又是1.149999?

因为要用BCD码表示个位、十分位、百分位,我用int c = (int)(v*100) % 10;
得到的c是4。

请问怎么解决这个问题?
yisikaipu 2012-10-15
  • 打赏
  • 举报
回复
float v = 1.15;

这行的意思是请编译器给你一个IEEE单精度浮点编码所能表示的最接近实数 1.15 的浮点数

请思考,double也不过8字节,而实数的数量是无限的

你不能幻想有限的比特能表达无限的信息
armsword 2012-10-14
  • 打赏
  • 举报
回复
浮点数相比较是使用精度误差来比较的,就是 |a - b|< 一个比较小的值。
j8daxue 2012-10-14
  • 打赏
  • 举报
回复
浮点不能精确表现出来,只能是接近值。

搜下计算机如何表示浮点数,看后应该就知道为什么不能100%精确。所以浮点不能直接比较相等。

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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