携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情
👋『大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流>』
✔「life motto」⇢ 种一棵树最好是十年前⇿其次是现在👌
📝<juejin>个人主页⇥謓泽 的个人主页 - 文章 - 掘金 (juejin.cn)
📚<系列专栏>⇥C语言关键字🍻 - 謓泽的专栏 - 掘金 (juejin.cn)
🏆2021年度博客之星物联网与嵌入式开发TOP5 2021博客之星Top100 阿里云专家博主^星级博主 CSDN⇿掘金⇿InfoQ[创作者]
⑨ double ⇿ 双精度浮点型
⒈描述⇢双精度浮点类型的使用关键字是 double,它在内存中占用的是 8 个字节。
⒉作用⇢定义一个双精度类型变量,然后其赋值浮点型数字,最后通过输出语句将其显示在控制台上
⒊注意⇢double 类型在程序默认输出 6 位小数点,有效数字是 6~7,格式符为%lf 的。
代码示例如下👇
#include<stdio.h> int main(void) { double a = 3.14159; printf("双精度浮点型 = %lf\n",a); return 0; }运行结果🖊
双精度浮点型 = 3.14159
拓展知识点🐱🏍小数的输出形式👇
%f 以十进制形式输出 float 类型;
%lf 以十进制形式输出 double 类型;
%e 以指数形式输出 float 类型,输出结果中的 e 小写;
%E 以指数形式输出 float 类型,输出结果中的 E 大写;
%le 以指数形式输出 double 类型,输出结果中的 e 小写;
%lE 以指数形式输出 double 类型,输出结果中的 E 大写。
#include<stdio.h> int main(void) { double a = 3.24359223; printf("双精度浮点型 = %.40lf\n", a); return 0; }运行结果🖊
双精度浮点类型 = 3.24359223...(以及小数点后面32位的0)
🍏注⇢ .40代表的是后续的小数点的数字保留多少位的数字。
📝拓展→浮点数的内容精度损失。
此时,张三同学在它的编译器发现了一个问题。
在上述的代码当中它发现在后面的小数点三十二位的0当中有一个数字不是0而是1,一开始张三同学还以为他看错了结果看了几遍都发现自己并没有看错。謓泽这个是怎么回事呢?明明在实际的值当中并没有出现过1的这个数字阿,按理来说不会这也阿。
张三同学出现这个问题我们就把它称之为四字:精度损失。从理论的角度上来说它打印出来的值因该是全0的数字的。那么想要知道为什么是这个样子的我们就需要了解一个概念就是数据的存储。数据存储这里就不详细的介绍了,在博主的[C 系列]的文章当中有一个已经讲的非常详细了。如果你对这个不了解的话可以去康康(●'◡'●)
🍎精度损失⇢上述的拓展当中我们提到过精度损失,接下来我们用代码来讲述下倒不如说是证明下这精度损失到底是不是为真正是浮点数类型为精度损失了。
#include <stdio.h> int main(void) { double x = 1.0; double y = 0.1; printf("x=%.20lf\n", x); printf("y=%.20lf\n", y); if ((x - 0.9) == 0.1) printf("No精度损失\n"); else printf("Yes精度损失\n"); return 0; }运行结果🖊
x = 1.00000000000000000000
y = 1.00000000000000001000
Yes精度损失
结论⇢浮点数在进行比较的时候,绝对不能直接使用==号来进行比较。
因为⇢浮点数本身就是存在着精度损失,从而导致最终结果有细微的差别的。