社区
C++ 语言
帖子详情
一道关于类型转换的基础题,挺奇怪的
sujinzhao407
2011-03-18 03:10:38
程序代码如下:
float step = 0.2;
cout << "1.0/step = " << 1.0/step << endl;
cout << "unsigned(1.0/step) = " << (unsigned)(1.0/step) << endl;
用g++编译器在Ubuntu 10.04下运行结果如下:
1.0/step = 5
unsigned(1.0/step) = 4
自己想不通,求原因?
...全文
77
8
打赏
收藏
一道关于类型转换的基础题,挺奇怪的
程序代码如下: float step = 0.2; cout << "1.0/step = " << 1.0/step << endl; cout << "unsigned(1.0/step) = " << (unsigned)(1.0/step) << endl; 用g++编译器在Ubuntu 10.04下运行结果如下: 1.0/step = 5 unsigned(1.0/step) = 4 自己想不通,求原因?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
jsjliuxing
2011-03-18
打赏
举报
回复
这不是类型转换的问题...
0.2用浮点数是不能精确表示的,所以编译器要么把它翻译成最大的0.2小的float类型值要么是最小的比0.2大的float类型值。(这里显然是前者)
然后1.0 / step结果就会比5小一点,直接去整显然是4。但是如果你把它作为浮点数输出,cout会进行四舍五入操作,所以输出5
???
bluewanderer
2011-03-18
打赏
举报
回复
更正这里编译器是处理成最小的比0.2大的float类型值,类似于2.000001
bluewanderer
2011-03-18
打赏
举报
回复
这不是类型转换的问题...
0.2用浮点数是不能精确表示的,所以编译器要么把它翻译成最大的0.2小的float类型值要么是最小的比0.2大的float类型值。(这里显然是前者)
然后1.0 / step结果就会比5小一点,直接去整显然是4。但是如果你把它作为浮点数输出,cout会进行四舍五入操作,所以输出5
sujinzhao407
2011-03-18
打赏
举报
回复
[Quote=引用 2 楼 bluewanderer 的回复:]
这个时编译器在编译的时候是把0.2处理成0.1999999....还是2.000001...的问题...
[/Quote]
那我的编译器就只能将0.2按两者之一存储吧,不能一会是0.1999,一会又是2.001,因为直接转成整数的话是4,但保存成float的话是5,这就表明编译器对同一个值有两种保存形式?
sujinzhao407
2011-03-18
打赏
举报
回复
问题补充:
int tmp1 = 1.0/step;
float tmp2 = 1.0/step;
cout << "tmp1 = " << tmp1 << ", tmp2 = " << tmp2 << endl;
for(int i = 1; i <= int(float(1.0/step)); i++)
cout << i << endl;
结果如下:
tmp1 = 4, tmp2 = 5
1
2
3
4
貌似是类型转换出了问题,但将相除的结果直接转成整形应该没问题啊,因为是整除没有小数的问题,但如果我不想通过一个float类型变量,而直接将表达式用到for循环中,那么相除的结果一直为4,求原因??
bdmh
2011-03-18
打赏
举报
回复
这是浮点数的特殊存储造成的,你看到的结果是5,但是内存中可能是4.999999或者5.00000001,恰好你的是4.9999999,这样转换成整形后就是取整,为4
bluewanderer
2011-03-18
打赏
举报
回复
这个时编译器在编译的时候是把0.2处理成0.1999999....还是2.000001...的问题...
转自知乎 知乎ID@方志宏 记
一道
简单的Java面试
题
转自知乎 知乎ID@方志宏 记
一道
简单的Java面试
题
这可能是历史上最简单的
一道
Java面试
题
题
目很简单,完成代码,判断一个整数是否是奇数 public boolean isOdd(int t) ...
【52期】记
一道
简单的Java面试
题
,但答错率很高!
程序员的成长之路互联网/程序员/技术/资料共享关注阅读本文大概需要 3.7 分钟。来自:https://zhuanlan.zhihu.com/p/57859872这可能是历史上最简单的...
Java后端面试
题
(Java
基础
)(更新中)
1.JAVA中的几种基本数据类型是什么,各自占用多少字节. 先了解2个单词:1、bit --位:位是计算机中存储数据的最小单位,指二进制数中的一个位数,其值为“0”或“1”。2、byte --字节:字节是计算机存储容量的基本单位,一个字节由8位二进制数组成。在计算机内部,一个字节可以表示一个数据,也可以表示一个英文字母,两个字节可以表示一个汉字。 1B=8bit 1Byte=8bit 1...
2020JS必看面试
题
1. javascript的typeof返回哪些数据类型. 答案:string,boolean,number,undefined,function,object 2. 例举3种强制
类型转换
和2种隐式
类型转换
? 答案:强制(parseInt,parseFloat,number) 隐式(== ===) 3. split() join() 的区别 答案:前者是将字符串切割成数组的形式,后者是将数组转换成...
计算机进位计数制实训课教案,进制转换汇报课教案[五篇]
《进制转换》教学设计课
题
:进制之间的转换教学内容:二进制、八进制、十进制、十六进制之间的转换 教授方法:讲授法教学目标:了解数制的基本概念掌握其它进制转十进制和十进制转其它进制的方法教学重难点:二进制、八进制、十进制、十六进制之间的转换进制转换的方法教学活动:一、 创设情境、激趣导入时钟工作的原理,让学生了解生活中的进制数,激发学生对进制数的兴趣。自然语言中一般使用十进制,但计算机处理信息和数据归...
C++ 语言
64,685
社区成员
250,491
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章