c语⾔语句floatx的作⽤,C语⾔中的⼩数(float,double)
⼩数分为整数部分和⼩数部分,它们由点号.分隔,例如 0.0、75.0、4.023、0.27、-937.198 -0.27 等都是合法的⼩数,这是最常见的⼩数形式,我们将它称为⼗进制形式。
此外,⼩数也可以采⽤指数形式,例如 7.25×102、0.0368×105、100.22×10-2、-27.36×10-3 等。任何⼩数都可以⽤指数形式来表⽰。
C语⾔同时⽀持以上两种形式的⼩数。但是在书写时,C语⾔中的指数形式和数学中的指数形式有所差异。
C语⾔中⼩数的指数形式为:
aEn 或 aen
a 为尾数部分,是⼀个⼗进制数;n 为指数部分,是⼀个⼗进制整数;E或e是固定的字符,⽤于分割尾数部分和指数部分。整个表达式等价于 a×10n。
指数形式的⼩数举例:
2.1E5 = 2.1×105,其中 2.1 是尾数,5 是指数。
3.7E-2 = 3.7×10-2,其中 3.7 是尾数,-2 是指数。
0.5E7 = 0.5×107,其中 0.5 是尾数,7 是指数。
C语⾔中常⽤的⼩数有两种类型,分别是 float 或 double;float 称为单精度浮点型,double 称为双精度浮点型。
不像整数,⼩数没有那么多⼳蛾⼦,⼩数的长度是固定的,float 始终占⽤4个字节,double 始终占⽤8个字节。
⼩数的输出
⼩数也可以使⽤ printf 函数输出,包括⼗进制形式和指数形式,它们对应的格式控制符分别是:
%f 以⼗进制形式输出 float 类型;
%lf 以⼗进制形式输出 double 类型;
%e 以指数形式输出 float 类型,输出结果中的 e ⼩写;
%E 以指数形式输出 float 类型,输出结果中的 E ⼤写;
%le 以指数形式输出 double 类型,输出结果中的 e ⼩写;
%lE 以指数形式输出 double 类型,输出结果中的 E ⼤写。
下⾯的代码演⽰了⼩数的表⽰以及输出:
#include
#include
int main()
{
float a = 0.302;
float b = 128.101;
double c = 123;
float d = 112.64E3;
double e = 0.7623e-2;
float f = 1.23002398;
printf("a=%e \nb=%f \nc=%lf \nd=%lE \ne=%lf \nf=%f\n", a, b, c, d, e, f);
return 0;
}
运⾏结果:
a=3.020000e-01
b=128.100998
c=123.000000
d=1.126400E+05
e=0.007623
f=1.230024
对代码的说明:
1) %f 和 %lf 默认保留六位⼩数,不⾜六位以 0 补齐,超过六位按四舍五⼊截断。
2) 将整数赋值给 float 变量时会变成⼩数。
3) 以指数形式输出⼩数时,输出结果为科学计数法;也就是说,尾数部分的取值为:0 ≤ 尾数 < 10。
4) b 的输出结果让⼈费解,才三位⼩数,为什么不能精确输出,⽽是输出⼀个近似值呢?这和⼩数在内存中的存储形式有关,很多简单的⼩数压根不能精确存储,所以也就不能精确输出,我们将在下节《⼩数在内存中是如何存储的,揭秘诺贝尔奖级别的设计(长篇神⽂)》中详细讲解。
另外,⼩数还有⼀种更加智能的输出⽅式,就是使⽤%g。%g 会对⽐⼩数的⼗进制形式和指数形式,以最短的⽅式来输出⼩数,让输出结果更加简练。所谓最短,就是输出结果占⽤最少的字符。
%g 使⽤⽰例:
#include
#include
int main()
{
float a = 0.00001;
浮点型变量floatfloat b = 30000000;
float c = 12.84;
float d = 1.229338455;
printf("a=%g \nb=%g \nc=%g \nd=%g\n", a, b, c, d);
return 0;
}
运⾏结果:
a=1e-05
b=3e+07
c=12.84
d=1.22934
对各个⼩数的分析:
a 的⼗进制形式是 0.00001,占⽤七个字符的位置,a 的指数形式是 1e-05,占⽤五个字符的位置,指数形式较短,所以以指数的形式输出。
b 的⼗进制形式是 30000000,占⽤⼋个字符的位置,b 的指数形式是 3e+07,占⽤五个字符的位置,指数形式较短,所以以指数的形式输出。
c 的⼗进制形式是 12.84,占⽤五个字符的位置,c 的指数形式是 1.284e+01,占⽤九个字符的位置,⼗进制形式较短,所以以⼗进制的形式输出。
d 的⼗进制形式是 1.22934,占⽤七个字符的位置,d 的指数形式是 1.22934e+00,占⽤⼗⼀个字符的位置,⼗进制形式较短,所以以⼗进制的形式输出。
读者需要注意的两点是:
%g 默认最多保留六位有效数字,包括整数部分和⼩数部分;%f 和 %e 默认保留六位⼩数,只包括⼩数部分。
%g 不会在最后强加 0 来凑够有效数字的位数,⽽ %f 和 %e 会在最后强加 0 来凑够⼩数部分的位数。
总之,%g 要以最短的⽅式来输出⼩数,并且⼩数部分表现很⾃然,不会强加零,⽐ %f 和 %e 更有弹性,这在⼤部分情况下是符合⽤户习惯的。
除了 %g,还有 %lg、%G、%lG:
%g 和 %lg 分别⽤来输出 float 类型和 double 类型,并且当以指数形式输出时,e⼩写。
%G 和 %lG 也分别⽤来输出 float 类型和 double 类型,只是当以指数形式输出时,E⼤写。
数字的后缀
⼀个数字,是有默认类型的:对于整数,默认是 int 类型;对于⼩数,默认是 double 类型。
请看下⾯的例⼦:
long a = 100;
int b = 294;
float x = 52.55;
float y = 18.6;
100 和 294 这两个数字默认都是 int 类型的,将 100 赋值给 a,必须先从 int 类型转换为 long 类型,⽽将 294 赋值给 b 就不⽤转换了。
52.55 和 18.6 这两个数字默认都是 double 类型的,将 52.55 赋值给 x,必须先从 double 类型转换为 float 类型,⽽将 18.6 赋值给y 就不⽤转换了。
如果不想让数字使⽤默认的类型,那么可以给数字加上后缀,⼿动指明类型:
在整数后⾯紧跟 l 或者 L(不区分⼤⼩写)表明该数字是 long 类型;
在⼩数后⾯紧跟 f 或者 F(不区分⼤⼩写)表明该数字是 float 类型。
请看下⾯的代码:
long a = 100l;
int b = 294;
short c = 32L;
float x = 52.55f;
double y = 18.6F;
float z = 0.02;
加上后缀,虽然数字的类型变了,但这并不意味着该数字只能赋值给指定的类型,它仍然能够赋值给其他的类型,只要进⾏了⼀下类型转换就可以了。
对于初学者,很少会⽤到数字的后缀,加不加往往没有什么区别,也不影响实际编程,但是既然学了C语⾔,还是要知道这个知识点的,万⼀看到别⼈的代码这么⽤了,⽽你却不明⽩怎么回事,那就尴尬了。
关于数据类型的转换,我们将在《C语⾔数据类型转换》⼀节中深⼊探讨。
⼩数和整数相互赋值
在C语⾔中,整数和⼩数之间可以相互赋值:
将⼀个整数赋值给⼩数类型,在⼩数点后⾯加 0 就可以,加⼏个都⽆所谓。
将⼀个⼩数赋值给整数类型,就得把⼩数部分丢掉,只能取整数部分,这会改变数字本来的值。注意是直接丢掉⼩数部分,⽽不是按照四舍五⼊取近似值。
请看下⾯的代码:
#include
int main(){
float f = 251;
int w = 19.427;
int x = 92.78;
int y = 0.52;
int z = -87.27;
printf("f = %f, w = %d, x = %d, y = %d, z = %d\n", f, w, x, y, z);
return 0;
}
运⾏结果:
f = 251.000000, w = 19, x = 92, y = 0, z = -87
由于将⼩数赋值给整数类型时会“失真”,所以编译器⼀般会给出警告,让⼤家引起注意。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。