C语言中四舍五入问题总结
C语言中四舍五入问题的总结
在C语言中大部分情况下都是不需要四舍五入的。
除了一种情况:在使用输出函数 printf()限制浮点型输出的小数位个数
eg:
printf("%0.2f",1.567);//输出的结果是1.57
其他情况下都不需要四舍五入,比如
- 自动转换
在不同类型的混合运算中,编译器也会自动地转换数据类型,将参与运算的所有数据先转换为同一种类型,然后再进行计算。
转换的规则:转换按数据长度增加的方向进行,以保证数值不失真,或者精度不降低。
eg:
① int 和 long 参与运算时,先把 int 类型的数据转成 long 类型后再进行运算。
② 所有的浮点运算都是以双精度进行的,即使运算中只有 float 类型,也要先转换为 double 类型,才能进行运算。
③ char 和 short 参与运算时,必须先转换成 int 类型。
- 强制转换
自动类型转换是编译器默默地、隐式地进行的一种类型转换,不需要在代码中体现出来;强制类型转换是程序员明确提出的、需要通过特定格式的代码来指明的一种类型转换。换句话说,自动类型转换不需要程序员干预,强制类型转换必须有程序员干预。
强制转换格式: (需要转换的数据类型) 变量
总结:无论是自动类型转换还是强制类型转换,都只是为了本次运算而进行的*临时性转换*,转换的结果也会保存到临时的内存空间(栈空间),不会改变数据本来的类型或者值。
debug程序如下:
#include<stdio.h>
int main(int argc, char const *argv[])
{
int a=((double)(3/2)+0.5+(int)1.987);
//(double)(3/2)先计算3/2,再强转,(double)(3/2)=1.0,(int)1.987=1
int b=1.9+2.3;
//先计算 1.9+2.3(其中自动转化成double类型),因为b是int类型,所以b=4
printf("a=%d\n",a);
printf("b=%d\n",b);
printf("(int)1.6: %d\n",(int)1.6);
printf("1.6: %#x\n",1.6);
printf("3.0+2: %f\n",3.0+2);
printf("3.0+2: %d\n",3.0+2);
return 0;
}
运行结果 :
PS E:\桌面资料\jing117> cd "e:\桌面资料\jing117" ; if ($?) { gcc debug.c -o debug } ; if ($?) { .\debug }
a=2
b=4
(int)1.6: 1
1.6: 0x9999999a
3.0+2: 5.000000
3.0+2: 0
需要注意的是,
-
在运行代码
printf("1.6: %#x\n",1.6);
时,得到的结果并不是1 ,而是0x9999999a,说明格式printf("1.6: %#x\n",1.6);
不能正确引用输出。 -
在运行代码
printf("3.0+2: %d\n",3.0+2);
时,得到的结果并不是5 ,而是0。这是为什么呢?