小数分为整数部分和小数部分,它们由点号.分隔,例如 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<stdio.h>
#include<stdlib.h>
intmain()
{
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);return0;
}

运行结果:

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<stdio.h>
#include<stdlib.h>
intmain()
{
float a =0.00001;
float b =30000000;
float c =12.84;
float d =1.229338455;
printf("a=%g \nb=%g \nc=%g \nd=%g\n", a, b, c, d);return0;
}

运行结果:

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;
double 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语言中,整数和小数之间可以相互赋值:

  • 将一个整数赋值给小数类型,在小数点后面加 0 就可以,加几个都无所谓。

  • 将一个小数赋值给整数类型,就得把小数部分丢掉,只能取整数部分,这会改变数字本来的值。注意是直接丢掉小数部分,而不是按照四舍五入取近似值。

请看下面的代码:

#include<stdio.h>
intmain(){
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);return0;
}

运行结果:

f = 251.000000, w = 19, x = 92, y = 0, z = -87

由于将小数赋值给整数类型时会“失真”,所以编译器一般会给出警告,让大家引起注意。

C语言中的小数(float,double)相关推荐

  1. 第三章 变量和数据类型_C语言中的小数(float,double)

    小数分为整数部分和小数部分,它们由点号.分隔,例如 0.0.75.0.4.023.0.27.-937.198 -0.27 等都是合法的小数,这是最常见的小数形式,我们将它称为十进制形式. 此外,小数也 ...

  2. C/C++语言中计算int,float,double,char四种数据类型所能表示的数据范围

    char        1字节    short       2字节    int         4字节    long        4字节    long long   8字节    float ...

  3. C语言学习(十)C语言中的小数

    C语言学习(十)C语言中的小数 小数的表示方式 小数分为整数部分和小数部分,他们之间用点号.分隔,如0.0.7.5.4.098.0.27.-987.333等都是合法小数,这是最常见的小数形式,我们称为 ...

  4. 从零开始的嵌入式生活:c语言中的小数和数据类型转换

    一.C语言中的小数 小数分为整数部分和小数部分,它们由点号.分隔,例如 0.0.75.0.4.023.0.27.-937.198 -0.27 等都是合法的小数,这是最常见的小数形式,我们将它称为十进制 ...

  5. C 语言实例 - 计算 int, float, double 和 char 字节大小

    C 语言实例 - 计算 int, float, double 和 char 字节大小C 语言实例 C 语言实例使用 sizeof 操作符计算int, float, double 和 char四种变量字 ...

  6. c语言中怎么使用float,float在c语言中怎么用

    C语言中printf输出float和double都用%f么(scanf又 1.C语言中printf输出float和double都可以用%f,而double型数据还可以用%lf. 2.scanf当中若是 ...

  7. float在html语言中的用法,float属性值包括

    html中不属于float常用属性值的是float常用的值就三个:left\right\none.没有其他的值了. 其中none这个值是默认的,所以一般不用写. css中float属性有几种用法?值 ...

  8. 编程c语言中_是什么意思,计算机C语言中的关键字:double是什么意思?

    用户提问 RT 推荐答案 double:表示双精度字型. C语言中的关键字: auto :声明自动变量 break:跳出当前循环 case:开关语句分支 char :声明字符型变量或函数返回值类型 c ...

  9. c语言中取小数函数,C / C++ 保留小数函数(setprecision(n)的一些用法总结)

    从C语言开始正式学习C++,但是一上来输出位数就懵了,查资料才知道C++需要使用 " setprecision  "函数.自己总结一下. 首先说C++代码 #include //s ...

最新文章

  1. java 模拟ajax上传图片
  2. 第十一周项目实践4 BFS(广度优先搜索)基本模板
  3. BAD APPLE C++控制台程序
  4. 【Azure Show】|第九期 “我的计算机入门之路” 嘉宾秦婷婷汪宇杰文轩
  5. c#中关于协变性和逆变性(又叫抗变)帮助理解
  6. 用面向对象解决问题(洛谷P1093题题解,Java语言描述)
  7. java线程池1001java线程池_深入浅出Java(Android )线程池ThreadPoolExecutor
  8. 为什么系统调用会消耗较多资源?系统调用的三种方法:软件中断(分析过程)、SYSCALL指令、vDSO(虚拟动态链接对象linux-vdso.so.1)
  9. Domino服务器以及Notes客户端重新配置的方法
  10. BZOJ 1053: [HAOI2007]反素数ant
  11. [转]ASP.NET MVC IOC 之AutoFac攻略
  12. 12.13 Nginx防盗链 12.14 Nginx访问控制 12.15 Nginx解析php相关配置 12.16 Nginx代理
  13. PDF文档无法注释或高亮的解决办法
  14. AAAI2021论文列表(中英对照)
  15. 多组学联合分析整体思路
  16. Python提取PDF简历中的信息,写入Excel
  17. RestTemplate的No instances available for xxx
  18. Android 音视频深入 十八 FFmpeg播放视频,有声音(附源码下载)
  19. 原生js提供的视频画中画api
  20. [Image_Codec]常见图片格式的封装及编解码-Android平台(三)JPG

热门文章

  1. 微信服务器IP地址详解,并判断该地址是否来自微信
  2. android 动态图形,Android 加载GIF动态图片
  3. 第十一PickerView
  4. Logback第十四章:Receivers
  5. 国内著名大学课件大全]线点播
  6. 目标检测:SSD和DSSD算法的对比分析
  7. 【纯记录】谨以此文悼念我为此失去的时间|vim+pyclewn|
  8. 安卓读取蓝牙BLE设备信息
  9. 学校教务管理系统的设计与实现--Word文档可在最后链接处下载,无code
  10. python五子棋ai棋力最高_【五子棋AI循序渐进】发布一个完整的有一定棋力的版本(含源码)...