单精度与双精度
%lf 与%f:单精度与双精度
学习c语言,在进行实验练习时遇到了单双精度的问题,在这里和大家分享下。
问题
:
计算某市出租车收费标准下的收费,因为收费标准多样,现定:车费=起步价+超出起步的里程数*单价
代码
#include<stdio.h>
#include<stdlib.h>
int main(){
double BasicPrice,UnitPrice;//BasicPride是起步价,UnitPrice是单价
float Basicmile,allmile;//Basicmile是起步的里程数,allmile表示总里程数
float money;//money表示最后收费
printf("请依次输入 起步价 单价 起步的里程数 总里程数:");
scanf("%lf %lf %f %f",&BasicPrice,&UnitPrice,&Basicmile,&allmile);
money=BasicPrice+UnitPrice*(allmile-Basicmile);
printf("收费%lf",money);
system("pause");
return 0;
}
大家请注意
double BasicPrice,UnitPrice;
float Basicmile,allmile;
这里有两种不同的变量double
和float
,当我们在进行数据接收时需要注意类型的匹配
这里进行正确和错误类型的示范:
正确
scanf("%lf %lf %f %f",&BasicPrice,&UnitPrice,&Basicmile,&allmile);
错误1
:
定义变量双精度,却只接收变量单精度
scanf("%f %f %f %f",&BasicPrice,&UnitPrice,&Basicmile,&allmile);
此时会出现数据错误
我们进一步测试,打印BasicPrice和UnitPrice:
可见这两个变量里面并不是我们输入的数字
这是因为在输入函数scanf中接收的是%f也就是单精度类型(通常是6位有效数字),但是一开始BasicPrice和UnitPrice被定义为双精度类型(通常是15或16位),一些数位未被覆盖到
就像涂色块游戏,在定义变量时就被赋予了地址,不过里面的值是随机的,它有自己的底色
但是因为你的颜料不够(只接收了6位有效数字)没涂满,原来的一些颜色没被覆盖:
所以输出就会呈现乱码状
错误2
:
定义了单精度,却接收了双精度
scanf("%lf %lf %lf %lf",&BasicPrice,&UnitPrice,&Basicmile,&allmile);
显示变量周围的堆栈已损坏
,为什么呢?
还是因为尺寸不匹配啊,原来的float存储大小不够接受double大小,就只能写到周围的地方啦
总结
- 写代码的时候注意数据类型的匹配