注册 登录
编程论坛 C++教室

[奇怪]简单的C++程序,疑问

maxlea 发布于 2007-01-24 17:00, 1886 次点击


#include <iostream>
using namespace std;
int main()
{
    float a=50.25,b=11.17;
    cout.setf(ios_base::fixed,ios_base::floatfield);
    cout << \"a = \" << a << endl
         << \"b = \" << b << endl
         << \"a + b = \" << a + b
         << endl ;
    return 0;
}

结果是61.41998,float 是精确到6位的,为什么会出现这样的结果呢?我们口算是61.42,这个才4位啊?

[此贴子已经被作者于2007-1-27 22:39:41编辑过]

11 回复
#2
csight2007-01-24 17:11
这个可能和计算机的内部数据的二进制表示有关;
LZ有疑问的话可以去查阅一些这方面的书,定有收益!
#3
song42007-01-24 18:06
换double 就应该没事了吧
#4
maxlea2007-01-24 18:52
我只是想知道为什么这样,不是为了实现,这是C++PRIMER里面的一个例子,它又说float是六位精确,这个事实和他自己矛盾了,所以偶郁闷啊
#5
tyc6112007-01-25 01:16
以下是引用maxlea在2007-1-24 17:00:00的发言:


#include <iostream>
using namespace std;
int main()
{
    float a=50.25,b=11.17;
    cout.setf(ios_base::fixed,ios_base::floatfield);
    cout << \"a = \" << a << endl
         << \"b = \" << b << endl
         << \"a + b = \" << a + b
         << endl ;
    return 0;
}

结果是61.41998,float 是精确到6位的,为什么会出现这样的结果呢?我们口算是61.42,这个才4位啊?

首先,50.25和11.17是浮点型字面值,其类型是double,而你把它赋值给float类型,这样可能会损失精度;
其次,再来分析为什么会损失精度?由于在计算机中数据是按二进制存储的(相信你也会这种计算),所以本身在存储时就有精度损失(当然,这种损失很小)。当把double型转换成float型,损失的精度位数更多了,所以才出现了你的结果。另外,float型一般情况下在C++中没用,直接用double型就行了,并且,现在机器上double可能运算更快(以前之所以用float而不是double,速度是一个原因)

#6
maxlea2007-01-25 14:27

谢谢楼上的

#7
song42007-01-25 18:27
#include<iostream.h>
void main()
{
for(float x=0; x<=1.0; x=x+0.1)
cout<<x<<",";
cout<<endl;
}
还有有趣的呢
#8
一二三四五2007-01-25 19:09
什么有趣的?
#9
song42007-01-25 20:33
你输出是什么
#10
monkeyzhen2007-01-27 19:30

[QUOTE] 0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,[/QUOTE]

可是没有看出来什么有意思的啊...

#11
maxlea2007-01-27 22:28


#include<iostream>
using namespace std ;
int  main()
{
        for(float x=0; x<=1.0; x=x+0.1)
             cout<<x<<\",\";
        cout<<endl;
        bool m = (x<=1.0) ;
        cout << \"x = \" << x << endl ;
        cout.setf(ios_base::boolalpha) ;
        cout << \"x<=1.0 \" << m << endl ;
        bool n = (1<=1.0);
        cout << \"1<=1.0 \" << n << endl ;
        return 0 ;
}

版主这么一说,偶又发现了有意思的....但是怎么解释呢?
运行这个感觉不深入了解c++会有很多头疼的事情...

[此贴子已经被作者于2007-1-27 22:28:42编辑过]

#12
kai2007-01-29 05:00
It is ok now.
[CODE]#include <iostream>
using namespace std;
int main()
{
float a=50.25f,b=11.17f;
//cout.setf(ios_base::fixed,ios_base::floatfield);
cout << "a = " << a << endl
<< "b = " << b << endl
<< "a + b = " << a + b
<< endl ;
return 0;
}

[/CODE]
1