有关c++中double类型精确度的问题

#include<iostream>
using namespace std;
void f(double n)
{
if(n!=0)
{
cout<<n<<" ";
f(n/10);
}
}
int main()
{
f(1234567);
return 0;
}
或者在void函数中把其改为 if(n>0),输出的还是很奇怪的数,然后只要把void(double n)改为void(int n),问题就迎刃而解了。我实在是搞不懂,我知道这可能与浮点数存在不精确有关,那为什么改为n>0还是错的呢~~忘大牛帮忙解决!

f(n/10);
里面的数字结果还是double的,这个应该没问题。
你不停地除以int 型的10,结果又不会小于0,当然会一直算下去直到double精度不够为止。

这个比较写的不规范,一般非int型与0比较是这样写的, (n - 0.0 < X)&&( n - 0.0 > -X),这里的X是误差修正值,看实际情况取的,0.0默认double型,如果是float型,就写0.0f

你把void(double n)改为void(int n)后,(n/10)结果虽然还是double型,但是只有f(int n)一个函数可以选择,传递参数时还是会强制截断成int的,这样只要数字小于10,转换后不就是0了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-09-26
递归结束不了,出现堆栈溢出的错误;
原因是浮点数的不精确,
1.浮点最好不要跟 0.0 比较相等,也不要与其它浮点数比较相等,因为不精确,
“相等”的解决办法,fabs(n-0.0)<1.0e-3; 保证在精度范围;
2. if (n>0) 相除 总是大于0的,所以,递归仍结束不了;

#include "math.h"

void f(double n)
{
if (fabs(n)>1.0e-3) // 这样就会结束递归的
{
cout<<n<<" ";
f(n/10);
}
}
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!本回答被提问者采纳
第2个回答  2012-01-10
浮点数不能比较两个数相等,只能相减,差很小就相等,可以n>0.01