小数分为整数部分和小数部分,用点标注。
分隔符,比如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 & ltstdio.h & gt# include & ltstdlib.h & gtint main(){ float a = 0.302;浮动b = 128.101双c = 123float d = 112.64E3双e = 0.7623 e-2;float f = 1.23002398printf(& # 34;a = % e \\ nb = % f \\ NC = % lf \\ nd = % lE \\ ne = % lf \\ nf = % f \\ n & # 34;,a,b,c,d,e,f);返回0;}
运算结果:
A = 3.020000 E-01
B = 128.100998
C = 123.000000
D = 1.126400 E+05
E =
代码描述:
1)默认为% f和%lf保留六位小数,不足六位用0填充,超过六位四舍五入。
2)当一个整数被赋给一个浮点变量时,它就变成了一个小数。
3)当小数以指数形式输出时,输出的结果是科学的计数方法;也就是说尾数部分的值是:0 ≤尾数< 10 .
4)b的输出结果莫名其妙,只有三位小数。为什么不能精确输出,而是一个近似值?这与小数在内存中的存储形式有关。很多简单的小数根本无法准确存储,所以无法准确输出。我们将在下一节“小数是如何存储在内存中的,揭秘诺贝尔奖级别的设计(一篇长文)”中详细讲解。
另外,还有一种更聪明的输出小数的方法,就是用% g。
。%g会比较小数的小数形式和指数形式,用最短的方式输出小数,使输出结果更加简洁。所谓最短,就是输出结果占用最少的字符。
%g用法示例:
# include & ltstdio.h & gt# include & ltstdlib.h & gtint main(){ float a = 0.00001;float b = 30000000浮动c = 12.84float d = 1.229338455printf(& # 34;a = % g \\ nb = % g \\ nc = % g \\ nd = % g \\ n & # 34,a,b,c,d);返回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。
请看下面的例子:
长a = 100int b = 294浮点x = 52.55双y = 18.6
默认情况下,100和294都是int类型。把100赋给A,首先要从int类型转换成long类型,而把294赋给B不需要转换。
默认情况下,数字52.55和18.6是双精度类型。要将52.55赋给X,必须先从double类型转换为float类型,不进行转换就将18.6赋给Y。
如果不想让号码使用默认类型,可以给号码添加后缀并手动指定类型:
在整数后面紧跟 l 或者 L(不区分大小写)表明该数字是 long 类型;在小数后面紧跟 f 或者 F(不区分大小写)表明该数字是 float 类型。
请看下面的代码:
龙a = 100lint b = 294短c = 32L浮点x = 52.55f双y = 18.6F浮点z = 0.02
加了后缀,虽然数的类型变了,但不代表数只能赋给指定的类型,还是可以赋给其他类型的,只要做了类型转换。
对于初学者来说,数字的后缀很少使用。加不加往往没什么区别,不影响实际编程。但是,既然学了C语言,还是要了解这个知识点。万一别人的代码被这样用了,你却不明白是怎么回事,那就尴尬了。
关于数据类型转换,我们将在“C语言中的数据类型转换”一节中深入讨论。
小数和整数相互赋值
在C语言中,整数和小数可以互相赋值:
将一个整数赋值给小数类型,在小数点后面加 0 就可以,加几个都无所谓。将一个小数赋值给整数类型,就得把小数部分丢掉,只能取整数部分,这会改变数字本来的值。注意是直接丢掉小数部分,而不是按照四舍五入取近似值。
请看下面的代码:
# include & ltstdio.h & gtint main(){ float f = 251;int w = 19.427int x = 92.78int y = 0.52int z =-87.27;printf(& # 34;f = %f,w = %d,x = %d,y = %d,z = % d \\ n & # 34,f,w,x,y,z);返回0;}
运算结果:
F = 251.000000,W = 19,X = 92,Y = 0,Z =-87。
因为将小数赋给整数类型会“失真”,所以编译器通常会给出警告以引起注意。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。