小数分为整数部分和小数部分,并用句点表示。
0.0、75.0、4.023、0.27、-937.198 -0.27 等分隔符都是合法的小数。这是最常见的十进制格式,称为十进制格式。
另外,小数也可以是指数形式,例如7.25102、0.0368105、100.2210-2和-27.3610-3。任何十进制数都可以用指数形式表示。
C 语言支持上面列出的两种形式的小数。但在书写时,C语言中的指数格式与数学中的指数格式不同。
C 语言十进制数的指数格式为:
安卡恩
a 是十进制尾数,n 是十进制整数E 或e。
用于分隔尾数和指数的固定字符。整个方程相当于a10n。
指数格式的小数示例:
2.1E5=2.1105,其中2.1是尾数,5是指数。 3.7E-2=3.710-2,其中3.7是尾数,-2是指数。 0.5E7=0.5107,其中0.5是尾数,7是指数。
C语言中常用的十进制数有两种类型:float和double称为单精度浮点类型,double称为双精度浮点类型。
与整数不同,十进制数没有那么多问题。 float 始终占用4 个字节,double 始终占用8 个字节。
小数的输出
还可以使用printf 函数打印带有相应格式控制字符的十进制数。
%f 以十进制格式输出浮点类型。 %lf 以十进制格式输出双精度类型。 %e 以指数格式打印浮点类型。 %E 以指数格式打印浮点类型。输出中的E 是大写字母。 %le以指数格式输出double类型,输出结果中的e为小写字母。 %lE 以指数格式打印double 类型,输出中的E 为大写字母。
以下代码显示了十进制表示和输出。
#include stdio.h#include stdlib.hint{ float a=0.302; double c=112.64E3; float f=1.23002398; \’a=%e \\nb=%f \\nc=%lf \\nd=%lE \\ne=%lf \\nf=%f\\n\’, a, b, c, d, e, f);
执行结果:a=3.020000e-01b=128.100998c=123.000000d=1.126400E+05e=0.007623f=1.230024
代码解释: 1)%f和%lf默认保留6位小数。如果小数点后不足6位,则补0。若小数点后超过6位,则四舍五入。
2) 将整数分配给浮点变量会产生十进制数。
3)以指数格式输出十进制数时,输出结果采用科学计数法,即尾数值为0尾数10。
4)为什么b的输出结果只有3位小数,而不是近似值?这与分数在内存中的存储方式有关。许多简单的十进制数无法精确存储,因此我们将在下一节《小数在内存中是如何存储的,揭秘诺贝尔奖级别的设计(长篇神文)》 中详细讨论它们。
此外,还有一种更智能的方式来打印小数。即使用%g。 %g 比较十进制数的指数和十进制格式,并以最短的方式打印十进制数,使输出结果更加简洁。所谓最短,是指输出结果占用的字符数最少。
使用%g 的示例:
#include stdio.h#include stdlib.hint main(){ float a=0.00001; float b=12.84; float d=1.229338455; g \\nd=%g\\n\’, a, b, c, d);
执行结果:a=1e-05b=3e+07c=12.84d=1.22934
个别小数分析:
a的十进制格式为0.00001,占用7个字符。 a的指数形式为1e-05,占用5个字符。指数格式较短,因此以指数格式输出。 b的十进制格式为30000000,占8个字符。 b的指数形式为3e+07,占用5个字符。指数格式较短,因此以指数格式输出。 c的十进制格式为12.84,占用5个字符。 c的指数形式为1.284e+01,占用9个字符。以十进制格式输出。 d的十进制格式为1.22934,占7个字符。 d的指数形式为1.22934e+00,占用11个字符。由于十进制格式很短,因此输出为十进制格式。
有两点读者应该注意:
%g 默认保留最多6 位有效数字,包括整数和小数部分。 %f 和%e 默认保存只有小数部分的6 位十进制数。 %g 不强制使用尾随零来四舍五入有效位数,而%f 和%e 强制使用尾随零来四舍五入小数位数。
也就是说,%g 应该以尽可能短的方式打印小数,并且小数部分表现得很自然,而不强制为零。这大多符合用户的习惯。
除了%g之外,还有%lg、%G、%lG。
%g和%lg分别用于float和double输出,以指数格式输出时e为小写。 %G 和%lG 也分别用于浮点和双精度输出,但以指数格式输出时,E 要大写。
数字的后缀
数字有默认类型。对于整数,默认为int;对于小数,默认为double。
请参阅下面的示例。
long a=100; int b=294; 双精度浮点数x=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 类型。
请参阅下面的代码。
长a=100l;整数b=294;短c=32L;双y=18.6F;
添加后缀改变了数字的类型,但并不意味着该数字只能赋给指定的类型,只要进行类型转换即可。
对于初学者来说,数字后缀很少使用,它们的存在或不存在对实际编程没有影响。然而,即使学了C语言,你也需要了解这些知识。看看别人的代码是这样的。如果你正在使用这个并且不明白发生了什么,那就很尴尬了。
数据类型转换在《C语言数据类型转换》 部分中有详细介绍。
小数和整数相互赋值
C 语言允许整数和小数相互赋值。
要将整数分配给十进制类型,只需在小数点后添加0 即可。添加多少并不重要。将小数值分配给整数类型时,必须丢弃小数部分并仅检索整数部分。这会改变数字的原始值。请注意,小数部分被直接截断,而不是四舍五入以近似值。
请参阅下面的代码。
#include stdio.hint main(){ float f=251; int z=-87.27; %d, y=%d, z=%d\\n\’, f, w, x, y, z; );返回。
结果:f=251.000000,w=19,x=92,y=0,z=-87
将小数分配给整数类型会“扭曲”整数类型,因此编译器通常会发出警告来提醒您小心小数点。
原创文章,作者:小条,如若转载,请注明出处:https://www.sudun.com/ask/82240.html