读书人

MFC中怪异的float精度有关问题

发布时间: 2012-11-12 12:31:58 作者: rapoo

MFC中怪异的float精度问题
我在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


[解决办法]
浮点不能精确表现出来,只能是接近值。

搜下计算机如何表示浮点数,看后应该就知道为什么不能100%精确。所以浮点不能直接比较相等。
[解决办法]
float v = 1.15;

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

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

你不能幻想有限的比特能表达无限的信息
[解决办法]
有时候是什么意思?

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

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

建议转成字符串再处理

C/C++ code
int main(){    char buf[10]={0};    float f=1.15f;    sprintf(buf,"%.5f",f);    // 再从buf中提取各个位    return 0;}
[解决办法]
浮点数十有一定的浮动的,也就是说
float a ,b;
要判断 a 是不是等于b 不一定就是完全相等。
就算要判断一个浮点数等不等于0 都要按照下面来比较
const float EPSINON = 0.00001;
float x;
判断x是否等于0
if (( x >= - EPSINON) && (x <= EPSINON) )
比较两个数是否相等也类似。
[解决办法]
探讨
引用:
float v = 1.15;

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

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

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


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

因为要用BCD码表示个位、十分位、百分位,我用int ……

读书人网 >C++

热点推荐