浮点数的转换问题

ttianqq 2008-12-05 03:48:35
float fTemp = 0.03;
fTemp *= 1000;
long lTemp = (long)fTemp;

上面的代码运行 fTemp值为30.00, 而lTemp的值为29
如果
float fTemp = 0.03;
fTemp *= 1000;
fTemp += 0.000001;
long lTemp = (long)fTemp;
则lTemp的值为30


如果
float fTemp = 0.03;
float fT1 = fTemp * 1000;
long lTemp = (long)fT1;
则lTemp的值为30

请问原因是什么, 是不是因为浮点数在内存中是0.0299999
如果换成double类型就不存在这个问题, double类型是怎么存储的呢?
...全文
146 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bfhtian 2008-12-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xxgamexx 的回复:]
不知道再大型设计里面是如何 避免这样的问题的?

全用double??
[/Quote]
看你所要算的数的精度,如果在float表示范围内就不用double了
xxgamexx 2008-12-05
  • 打赏
  • 举报
回复
不知道再大型设计里面是如何 避免这样的问题的?

全用double??
SearchLife 2008-12-05
  • 打赏
  • 举报
回复
精度问题
可以自己写个函数

C/C++ code
int Fun ( float data )
{
if ( data > 0 )
return static_cast<int> ( data + 0.5 );
else
return static_cast<int> ( data - 0.5 );
}


------------学习
CA_HA_M 2008-12-05
  • 打赏
  • 举报
回复
数据以2进制补码的方式存储于内存中,浮点数以指数形式存储,肯定会造成精度损失
机智的呆呆 2008-12-05
  • 打赏
  • 举报
回复
float 和double类型变量的值是离散的,也就是说有些值不能被计算机完全精确标示的

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
float fTemp = 0.03;
cout.precision(20);
cout<<fTemp<<endl;
system("pause");
}


像0.03就不能被精确标示,所以导致lz所说的问题
lann64 2008-12-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 ttianqq 的帖子:]
如果换成double类型就不存在这个问题, double类型是怎么存储的呢?
[/Quote]
精度问题,对double型一样存在。
ma100 2008-12-05
  • 打赏
  • 举报
回复
精度问题
可以自己写个函数

int Fun ( float data )
{
if ( data > 0 )
return static_cast<int> ( data + 0.5 );
else
return static_cast<int> ( data - 0.5 );
}
nullah 2008-12-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lc19890326 的回复:]
C/C++ code
#include <iostream>
#include <vector>
using namespace std;
int main()
{
float fTemp = 0.03;
fTemp *= 1000;
long lTemp = (long)fTemp;
cout<<fTemp<<" "<<lTemp<<endl;
}



都为30 VS2005下编译
可能依赖于你的编译器在转换时截断精度的问题
[/Quote]
yes
heeten 2008-12-05
  • 打赏
  • 举报
回复
学习
lc19890326 2008-12-05
  • 打赏
  • 举报
回复

#include <iostream>
#include <vector>
using namespace std;
int main()
{
float fTemp = 0.03;
fTemp *= 1000;
long lTemp = (long)fTemp;
cout<<fTemp<<" "<<lTemp<<endl;
}

都为30 VS2005下编译
可能依赖于你的编译器在转换时截断精度的问题

65,211

社区成员

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

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