社区
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
自己想不通,求原因?
...全文
113
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...的问题...
那些让人挠头的 JavaScript
类型转换
:
一道
看似简单的面试
题
当使用加法运算符连接一个数字和一个对象(这里是数组[0])时,JavaScript 会进行隐式
类型转换
。如果其中一个操作数是对象,则会将其转换为原始值。对于数组,会先尝试valueOf(),再尝试toString()。[0]的toString()方法返回字符串"0"。所以,加法表达式变成了1 + "0"。当一个数字和一个字符串相加时,数字会被转换为字符串,然后进行字符串拼接。1转换为字符串是"1"。"1" + "0"的结果是字符串"10"。
一道
“
奇怪
”的c指针问
题
源代码: #include #include void f(void) { int a[4]; int *b = malloc(16); int *c; int i; printf("1: a = %p, b = %p, c = %p\n", a, b, c); c = a; for (i = 0; i < 4; i++) a[
小记-----
一道
奇怪
的
题
今天一位刚进公司不久的PHP的同事出了
一道
题
,我答错了,很是得意。我在公司可能算经验比较丰富、比较有资历的吧,所以能出道我打错的
题
,可能认为是一件值得骄傲的事情,估计公司里面有这样变态心理的同事不止他一个。不过看淡就好,因为知道自己目标是什么?想要什么?其他的就不是很重要了。 我们来看看这道
题
: (int)((0.1+0.7)*10) 这道
题
我一看最初直接认为答案应该是0。因为以为小数直接取...
js
类型转换
由于 == 会把 [] 转换为一个空字符串,并将对象 {} 转换为其字符串 [object Object],所以比较的结果是 false。[] 等价于 [] == false,再等价于 “” == false,最后 “” == false 为 true。[] == false 会转换为 “” == false,而空字符串会被转换为 false,所以条件为 true,代码会执行。if 语句中的隐式转换:条件判断会将表达式隐式转换为布尔值,falsy 值会被转换为 false,其他则为 true。
js ~~ 或 + 把各
类型转换
成数字的两种方法
一、前言 在使用 js 的时候经常会出现要把非Number类型转为Number,而又因为 js 奇
奇怪
怪的转换规则而导致一头雾水。在这篇文章里我总结一下使用 + 和 ~~ 两种方式尝试把各
类型转换
为数字。 二、+ 的妙用 我曾做过
一道
题
: var a = false;var b = 1++a ; 问 b 为多少? 当时我看到这两个加号就隐约觉得不妙。。。实际上这里就用到了 “ + ”...
C++ 语言
65,210
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章