C语言中的小数

小数分为整数部分和小数部分,它们由点号.分隔,例如 0.0、78.0、4.023、0.27、-927.148 -0.57 等都是合法的小数,这是最常见的小数形式,我们将它称为十进制形式。

此外,小数也可以采用指数形式,例如 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>
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 <stdio.h>
#include <stdlib.h>
int main()
{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);return 0;
}

运行结果:

a=1e-05
b=3e+07
c=12.84
d=1.22934

对各个小数的分析:
1 . a 的十进制形式是 0.00001,占用七个字符的位置,a 的指数形式是 1e-05,占用五个字符的位置,指数形式较短,所以以指数的形式输出。

2 . b 的十进制形式是 30000000,占用八个字符的位置,b 的指数形式是 3e+07,占用五个字符的位置,指数形式较短,所以以指数的形式输出。

3 . c 的十进制形式是 12.84,占用五个字符的位置,c 的指数形式是 1.284e+01,占用九个字符的位置,十进制形式较短,所以以十进制的形式输出。

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

	将一个整数赋值给小数类型,在小数点后面加 0 就可以,加几个都无所谓。将一个小数赋值给整数类型,就得把小数部分丢掉,只能取整数部分,这会改变数字本来的值。注意是直接丢掉小数部分,而不是按照四舍五入取近似值。

请看下面的代码:

#include <stdio.h>
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

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

如果感觉不错的话请点赞哟!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

没有bug队——加贝——Python 43,44

目录 43.题目&#xff1a;模仿静态变量(static)另一案例。 44 - Python 两个矩阵相加 43.题目&#xff1a;模仿静态变量(static)另一案例。 程序分析&#xff1a;演示一个python作用域使用方法 #43 class Num:nNum 1def inc(self):self.nNum 1print (nNum %d % self.nN…

数学建模学习笔记(一)——层次分析模型

1.模型简介 层次分析模型主要应用于综合评价类问题&#xff0c;例如&#xff1a;怎样购买最划算、怎样养殖才能获得最大经济效益等等。 2.下面使用一道例题来说明这个问题 问题&#xff1a;你想要购置一台个人电脑&#xff0c;考虑价格、性能等因素&#xff0c;如何做出决策…

C语言英文字符的使用

字符的表示 字符类型由单引号’ 包围&#xff0c;字符串由双引号" "包围。 下面的例子演示了如何给 char 类型的变量赋值&#xff1a; //正确的写法 char a 1; char b $; char c X; char d ; // 空格也是一个字符//错误的写法 char x 中; //char 类型不能…

没有bug队——加贝——Python 45,46

目录 45.题目&#xff1a;统计 1 到 100 之和。 46.题目&#xff1a;求输入数字的平方&#xff0c;如果平方运算后小于 50 则退出。 实现1 实现2 Python While 循环语句 跳过循环 无限循环 循环使用 else 语句 45.题目&#xff1a;统计 1 到 100 之和。 #45 tmp 0 for…

没有bug队——加贝——Python 47,48

目录 47.题目&#xff1a;两个变量值互换。 实现1 实现2 48.题目&#xff1a;数字比较。 47.题目&#xff1a;两个变量值互换。 实现1 a 10 b 20 print(x ,a ,y ,b) a,b b,a print(x ,a ,y ,b) 输出&#xff1a; 实现2 #47 def exchange(a,b):a,b b,areturn (a,…

Latex笔记(一)—— 复杂表格的制作

引言 表格是论文写作中的重要一环&#xff0c;尤其是较为复杂的三线表的制作。 在网上寻找了很久发现没有比较综合的解释方法&#xff0c;因此将查阅的关于复杂三线表的制作的资料总结成了一篇笔记。 由于笔记是用Latex写作的&#xff0c;因此这里只放上Latex生成的pdf的截图&…

C语言转义字符的使用

字符集&#xff08;Character Set&#xff09;为每个字符分配了唯一的编号&#xff0c;我们不妨将它称为编码值。在C语言中&#xff0c;一个字符除了可以用它的实体&#xff08;也就是真正的字符&#xff09;表示&#xff0c;还可以用编码值表示。这种使用编码值来间接地表示字…

数学建模学习笔记(二)——Topsis优劣解距离法

&#xff08;续上篇文章&#xff09;层次分析法的局限 上一篇文章中&#xff0c;层次分析法有这样的局限 评价决策层不能太多&#xff1b;数据是已知的的话&#xff0c;便无法使用层次分析法进行精确的分析评价&#xff1b; 因此&#xff0c;为对这些情况做出更为精准的分析…

没有bug队——加贝——Python 49,50

49.题目&#xff1a;使用lambda来创建匿名函数。 lambda函数 紧跟的是定义的自变量&#xff0c;因变量等&#xff0c;其后是函数 MAXIMUM lambda x,y : (x > y) * x (x < y) * y MINIMUM lambda x,y : (x > y) * y (x < y) * xif __name__ __main__:a 10…

没有bug队——加贝——Python 51,52

目录 知识点&#xff1a; 51.题目&#xff1a;学习使用按位与 & 。 52.题目&#xff1a;学习使用按位或 | 。 知识点&#xff1a; 运算符描述实例&按位与运算符&#xff1a;参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0(a & b) 输出结果 12 …

数学建模学习笔记(三)——插值算法

插值算法简介 数据分析是在大数据时代下不可获取的一环&#xff0c;合理、全面地分析数据&#xff0c;能够使得决策者在决策时作出最为明智的决定。在数据分析过程中&#xff0c;常常可以使用插值算法来根据已知的数据估算出未知的数据&#xff0c;从而模拟产生一些新的值来满…

C语言自增和自减

一个整数类型的变量自身加 1 可以这样写&#xff1a; a a 1;或者 a 1;不过&#xff0c;C语言还支持另外一种更加简洁的写法&#xff0c;就是&#xff1a; a;或者 a;这种写法叫做自加或自增&#xff0c;意思很明确&#xff0c;就是每次自身加 1。 相应的&#xff0c;也有…

没有bug队——加贝——Python 53,54

目录 53.题目&#xff1a;学习使用按位异或 ^ 。 54.题目&#xff1a;取一个整数a从右端开始的4〜7位。 运算符描述实例&按位与运算符&#xff1a;参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0(a & b) 输出结果 12 &#xff0c;二进制解释&#xf…

数学建模学习笔记(四)——拟合算法

文章目录拟合算法简介一个线性规划的例子最小二乘法求解最小二乘法拟合检验总结拟合算法简介 与插值算法不同&#xff0c;拟合算法的目的是得到一条确定的曲线&#xff1b;而插值是根据已有的数据来获得一系列新的“靠谱”的数据。插值要求曲线必须全部经过样本数据点&#xf…

C语言运算符的优先级及结合性

C语言运算符的优先级我们结合实例了解会更加简单易懂。 示例程序 #include <stdio.h> int main(){int a 16, b 4, c 2;int d a b * c;int e a / b * c;printf( "d%d, e%d\n", d, e);return 0; }运行结果&#xff1a; d24, e81 . 对于表达式a b * c&a…

没有bug队——加贝——Python 55,56

55.题目&#xff1a;学习使用按位取反~。 说明&#xff1a; 二进制数在内存中以补码的形式存储。 按位取反&#xff1a;二进制每一位取反&#xff0c;0 变 1&#xff0c;1 变 0。 最高位为符号位&#xff0c;正数的符号位为 0&#xff0c;负数为 1。 对正数来说&#xff0…

数学建模学习笔记(五)——相关系数以及假设检验

文章目录皮尔逊相关系数假设检验下面来看一个例子斯皮尔曼(spearman)相关系数注意皮尔逊相关系数 总体皮尔逊&#xff08;Pearson&#xff09;相关系数 如果有 A:{A1,A2,⋯,An}A:\{A_1, A_2, \cdots, A_n\}A:{A1​,A2​,⋯,An​} 和 Y:{Y1,Y2,⋯,Yn}Y:\{Y_1, Y_2, \cdots, Y_n\…

没有bug队——加贝——Python 57,58

相关 tkinter 的介绍&#xff1a;Python 55&#xff0c;56 目录 57.题目&#xff1a;画图&#xff0c;学用line画直线。 58.题目&#xff1a;画图&#xff0c;学用rectangle画方形。   57.题目&#xff1a;画图&#xff0c;学用line画直线。 #57 from tkinter import *c…

C语言高级输出及进阶

在C语言中&#xff0c;有三个函数可以用来在显示器上输出数据&#xff0c;它们分别是&#xff1a; puts()&#xff1a;只能输出字符串&#xff0c;并且输出结束后会自动换行。putchar()&#xff1a;只能输出单个字符。printf()&#xff1a;可以输出各种类型的数据。printf() 是…

数学建模学习笔记(六)——多元线性回归分析

文章目录一、综述二、常见的回归分析三、对于相关性的理解四、一元线性回归模型五、对于回归系数的解释六、内生性七、四类线性模型回归系数的解释八、对于定性变量的处理——虚拟变量XXX九、下面来看一个实例十、扰动项需要满足的条件十一、异方差十二、多重共线性十三、逐步回…