关于C++的诡异问题

来源:百度知道 编辑:UC知道 时间:2024/09/21 04:33:42
char a = 2;
short b = 3;
long c = 100000;
double d = (double)b/a + c;
output居然是100002.....一直没想通为什么不是100001.5。我试过不加c,结果是1.5没错。。。但是一加c就要变,而且是神奇地四舍五入了的,还不是直接砍……但是试c=10000和1000都有.5,就100000就变2了。。。搞不懂。。。望高手指教!!
ps:我用的visual studio 2008编的
再请问一下,如果是输出位数不够,为什么是四舍五入而不是直接砍小数?另外按三楼的说法的话……整个式子的右边应该是double吧?double和long不是应该进成double吗?望指教!谢谢各位高手!!

如果是小数转为整数,是要取整的,不进行四舍五入的。
而这是小数转为小数,精确到多少位的情况,所以进行了四舍五入。

整个式子的右边应该是double,是小数。
double和long还是进成double。

unsigned char a = 2; // 整数
short b = 3;
double d = (double) b / (double) a + c; // 类型转换
cout.width(16); -- 设输出总位数
cout.precision(2);-- 设输出小数位数

默认输出位数不够,要自己设定。

double d=(double)b/a+c;
这句的意思是只是定义d为双精浮点数,将(double)b/a+c的值赋给d。使用强制类型转换不会改变某个变量的类型,(double)b看作一个整体,而不会把b变成双精浮点数。因此,(double)b/a+c也就等于(3.000000000000000)/2+100000,又由于在(double)b/a+c中,变量c是long型,它是该表达式中最高的类型,所以整个表达式是long型,当然long型不允许存在浮点数,就会四舍五入,将100002赋给d,而d就是双精浮点数,输出d应该是100002.00000000

主要是注意强制类型转换并不会改变变量的类型。

回复:因为编译系统的不同,有些是四舍五入,有些是直接砍掉小数位(比如Turbo C)。double d这一句的等式左边的变量d是double型,而等号右边是long型。

这是因为它的默认输出位数是6位,不信你换1000000试试,要输出100000.5你得用stew设置一下输出长度。