单精度浮点型与双精度浮点型的区分

类型 关键字 占位符 占用内存 有效数字位数(精度) 相当于生活中的…
单精度浮点型 float %f 4 字节 6 ~ 7 位 普通的家用计算器
双精度浮点型 double %lf 8 字节 15 ~ 16 位 科学实验室的精密仪器

💡 怎么理解“有效数字位数”?

这里的位数是从左边第一个不是 0 的数字开始算起的总位数,而不是单指小数点后面的位数。

举个例子:

假设我们要存圆周率 π

  • 如果用 float a = 3.1415926535;,因为 float 只能管好前 7 位数字,打印出来可能变成 3.141592(后面的数字就失真、变成乱码了)。
  • 如果用 double b = 3.1415926535;,它能管好前 15 位数字,打印出来就是非常精确的 3.1415926535

🎯 日常是不是可以直接用 float%f)?

答案是:平时练习完全可以!但有两个“潜规则”需要注意:

1. 为什么总是记不住 %lf

在 C 语言的 printf(打印输出) 中,由于标准的规定,float 类型的参数在传递给 printf 时会自动转换成 double

还有Python中,小数被统一成了Float这一个这对于学了Python的需要一段时间适应,C语言更加精准,更加精准,更加底层,所以就会出现这么多的定义符.

但是,不管是 float 还是 double 的变量,在 printf 里面直接用 %f 打印,都是完全合法的,不会报错!

也就是说:printf("体积为%.2f\n", volume); 这里的 volume 哪怕你定义成 double,用 %f 打印也完全没问题。这就解释了为什么你老觉得用 %f 就够了。

2. 唯一不能偷懒死穴:scanf(键盘录入)

虽然打印可以偷懒,但是用 scanf 读入数据时,必须严格对应,绝对不能搞混:

  • 如果你定义了 float x; ⇨ 必须用 scanf("%f", &x);
  • 如果你定义了 double y; ⇨必须用 scanf("%lf", &y);(如果这里偷懒用 %f,读进去的数据就会直接变成一堆奇怪的错误数字)。

记忆小连招

既然 %lf 记不住,那我们就用图形和口诀来记:

  • l 的含义lf 里的 l 实际上就是 long(长) 的意思。 所以就是长浮点数(long float)
  • 记忆联想double 占了 8 个字节,比 float 的 4 字节更、更大,所以要在 %f 前面加一个代表 long 的 l,连起来就是 %lf

总结

平时写写代码,变量类型可以直接无脑用 float,输入输出全用 %f。(图方便,因为平时用不上这么多)

只有当题目要求你定义 double 时,记住在 scanf 里给 %f 加个长长的尾巴变成 %lf 就行了!