C语言中的小数(float,double)
![](/assets/blank.gif)
小数分为整数部分和小数部分,它们由点号.分隔,例如 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)相关推荐
- 第三章 变量和数据类型_C语言中的小数(float,double)
小数分为整数部分和小数部分,它们由点号.分隔,例如 0.0.75.0.4.023.0.27.-937.198 -0.27 等都是合法的小数,这是最常见的小数形式,我们将它称为十进制形式. 此外,小数也 ...
- C/C++语言中计算int,float,double,char四种数据类型所能表示的数据范围
char 1字节 short 2字节 int 4字节 long 4字节 long long 8字节 float ...
- C语言学习(十)C语言中的小数
C语言学习(十)C语言中的小数 小数的表示方式 小数分为整数部分和小数部分,他们之间用点号.分隔,如0.0.7.5.4.098.0.27.-987.333等都是合法小数,这是最常见的小数形式,我们称为 ...
- 从零开始的嵌入式生活:c语言中的小数和数据类型转换
一.C语言中的小数 小数分为整数部分和小数部分,它们由点号.分隔,例如 0.0.75.0.4.023.0.27.-937.198 -0.27 等都是合法的小数,这是最常见的小数形式,我们将它称为十进制 ...
- C 语言实例 - 计算 int, float, double 和 char 字节大小
C 语言实例 - 计算 int, float, double 和 char 字节大小C 语言实例 C 语言实例使用 sizeof 操作符计算int, float, double 和 char四种变量字 ...
- c语言中怎么使用float,float在c语言中怎么用
C语言中printf输出float和double都用%f么(scanf又 1.C语言中printf输出float和double都可以用%f,而double型数据还可以用%lf. 2.scanf当中若是 ...
- float在html语言中的用法,float属性值包括
html中不属于float常用属性值的是float常用的值就三个:left\right\none.没有其他的值了. 其中none这个值是默认的,所以一般不用写. css中float属性有几种用法?值 ...
- 编程c语言中_是什么意思,计算机C语言中的关键字:double是什么意思?
用户提问 RT 推荐答案 double:表示双精度字型. C语言中的关键字: auto :声明自动变量 break:跳出当前循环 case:开关语句分支 char :声明字符型变量或函数返回值类型 c ...
- c语言中取小数函数,C / C++ 保留小数函数(setprecision(n)的一些用法总结)
从C语言开始正式学习C++,但是一上来输出位数就懵了,查资料才知道C++需要使用 " setprecision "函数.自己总结一下. 首先说C++代码 #include //s ...
最新文章
- java 模拟ajax上传图片
- 第十一周项目实践4 BFS(广度优先搜索)基本模板
- BAD APPLE C++控制台程序
- 【Azure Show】|第九期 “我的计算机入门之路” 嘉宾秦婷婷汪宇杰文轩
- c#中关于协变性和逆变性(又叫抗变)帮助理解
- 用面向对象解决问题(洛谷P1093题题解,Java语言描述)
- java线程池1001java线程池_深入浅出Java(Android )线程池ThreadPoolExecutor
- 为什么系统调用会消耗较多资源?系统调用的三种方法:软件中断(分析过程)、SYSCALL指令、vDSO(虚拟动态链接对象linux-vdso.so.1)
- Domino服务器以及Notes客户端重新配置的方法
- BZOJ 1053: [HAOI2007]反素数ant
- [转]ASP.NET MVC IOC 之AutoFac攻略
- 12.13 Nginx防盗链 12.14 Nginx访问控制 12.15 Nginx解析php相关配置 12.16 Nginx代理
- PDF文档无法注释或高亮的解决办法
- AAAI2021论文列表(中英对照)
- 多组学联合分析整体思路
- Python提取PDF简历中的信息,写入Excel
- RestTemplate的No instances available for xxx
- Android 音视频深入 十八 FFmpeg播放视频,有声音(附源码下载)
- 原生js提供的视频画中画api
- [Image_Codec]常见图片格式的封装及编解码-Android平台(三)JPG
热门文章
- 微信服务器IP地址详解,并判断该地址是否来自微信
- android 动态图形,Android 加载GIF动态图片
- 第十一PickerView
- Logback第十四章:Receivers
- 国内著名大学课件大全]线点播
- 目标检测:SSD和DSSD算法的对比分析
- 【纯记录】谨以此文悼念我为此失去的时间|vim+pyclewn|
- 安卓读取蓝牙BLE设备信息
- 学校教务管理系统的设计与实现--Word文档可在最后链接处下载,无code
- python五子棋ai棋力最高_【五子棋AI循序渐进】发布一个完整的有一定棋力的版本(含源码)...