1031967096 发表于 2019-5-20 15:00:27

double和float的区别到底是怎么样的

我在做第八课的第一个计算温度的题

有一次小甲鱼受邀到华盛顿参加演讲,一查天气预报有 45 度高温,于是穿着短袖沙滩裤就出发了……结果到了那里才发现冻成狗!后来才知道人家老外习惯使用的温度单位是华氏度(F),不是咱的摄氏度(C)……(以上内容纯属YY)=e$"_^~
问题:写一个华氏度到摄氏度的转换程序,用户输入华氏度,程序计算并输出对应的摄氏度。
1摄氏度 =(1华氏度 – 32)* 5 / 9

我用的数据类型是double答案是用的float

搞不懂两者到底区别在哪。查了百度也有点蒙蔽,能不能通俗易懂的解答与喜爱

wp231957 发表于 2019-5-20 15:02:49

现在没啥太大区别了   默认推荐double了
早先 电脑硬件比较紧张单精度据说能节省一些内存,现在吗谁还差那点内存

1031967096 发表于 2019-5-20 15:29:36

wp231957 发表于 2019-5-20 15:02
现在没啥太大区别了   默认推荐double了
早先 电脑硬件比较紧张单精度据说能节省一些内存,现在吗谁还 ...

我也是习惯用double但是 做题去计算那个温度的时候用float和double 的数据类型 编译出来的计算结果不同

jackz007 发表于 2019-5-20 15:33:26

本帖最后由 jackz007 于 2019-5-20 15:49 编辑

1、数字编码:
   float:总共 32 位,其中,1 个符号位, 8个指数位,23 个尾数位
double:总共 64 位,其中,1 个符号位,11个指数位,52 个尾数位

2、表达范围:
float:-3.40E+38~+3.40E+38
double: -1.79E+308 ~+1.79E+308

3、数值精度:
    浮点数在内存中是按科学计数法来存储的,其精度取决于数字编码中的尾数长度,float 有 23 个尾数位,2 ^ 23 = 8388608,一共 7 位,可见,float 的数值精度是 6 位,double 有 52 个尾数位,2 ^ 52 = 4503599627370496,一共有 16 位,可见,double 的数值精度是 15 位。

      显然,double 的表达能力更加强大,但是,与 float 相比,使用 double 的劣势也很明显,一是占用内存资源多,而是运行效率低,所以,使用时,要合理权衡利弊。

wp231957 发表于 2019-5-20 15:33:49

1031967096 发表于 2019-5-20 15:29
我也是习惯用double但是 做题去计算那个温度的时候用float和double 的数据类型 编译出来的计算结果不 ...

不可能,那是你代码有问题

1031967096 发表于 2019-5-20 15:36:14

wp231957 发表于 2019-5-20 15:33
不可能,那是你代码有问题

#include<stdio.h>

int main()
{
        float a , b ;
        printf("请输入华氏度:");
        scanf("%f",&a);
       
        b = (a - 32) * 5 / 9;
        printf("转化为摄氏度是:%.2f\n",b);
       
        return 0;
       
}

结果
请输入华氏度:45
转化为摄氏度是:7.22

#include<stdio.h>

int main()
{
        double a , b ;
        printf("请输入华氏度:");
        scanf("%f",&a);
       
        b = (a - 32) * 5 / 9;
        printf("转化为摄氏度是:%.2f\n",b);
       
        return 0;
       
}

结果
请输入华氏度:45
转化为摄氏度是:-17.78



大佬请过目!{:5_108:}

wp231957 发表于 2019-5-20 15:37:46

scanf("%f",&a);
printf("转化为摄氏度是:%.2f\n",b);

第二段代码把这两个%f修改为%lf

1031967096 发表于 2019-5-20 15:40:50

wp231957 发表于 2019-5-20 15:37
scanf("%f",&a);
printf("转化为摄氏度是:%.2f\n",b);



哇,真滴强!谢大佬!学到了。意思是double对应的输出符是%lffloat对应的是%f吗

1031967096 发表于 2019-5-20 15:41:31

jackz007 发表于 2019-5-20 15:33
显然,double 的表达能力更加强大,但是,与 float 相比,使用 double 的劣势也很明显,一是占用内存 ...

感谢感谢

wp231957 发表于 2019-5-20 15:42:50

1031967096 发表于 2019-5-20 15:40
哇,真滴强!谢大佬!学到了。意思是double对应的输出符是%lffloat对应的是%f吗

是得

1031967096 发表于 2019-5-20 15:47:33

wp231957 发表于 2019-5-20 15:42
是得

感谢大佬!{:5_106:}

Croper 发表于 2019-5-20 16:25:52

本帖最后由 Croper 于 2019-5-20 16:28 编辑

wp231957 发表于 2019-5-20 15:37
scanf("%f",&a);
printf("转化为摄氏度是:%.2f\n",b);



嗯。。准确地说,printf是不该用"%lf"的,这个并不在标准之内,虽然现在很多编译器都支持。但理论上来说,这是错误的写法。
printf只有%f没有%lf。

至于其原因,是因为C语言里使用可变参数时,为了保证形参的长度统一,会自动发生类型的转换,也就是printf中的float和double都会被转换为double,同时使用“%f”作为标记符。也就是正确的答案应该是scanf中的“%f”改为“%lf"而printf中的不变。

https://blog.csdn.net/shenzhou111/article/details/7826444

wp231957 发表于 2019-5-20 16:31:07

Croper 发表于 2019-5-20 16:25
嗯。。准确地说,printf是不该用"%lf"的,这个并不在标准之内,虽然现在很多编译器都支持。但理论上来 ...

收到,学习了

无敌大帅哥 发表于 2019-7-15 19:35:56

Croper 发表于 2019-5-20 16:25
嗯。。准确地说,printf是不该用"%lf"的,这个并不在标准之内,虽然现在很多编译器都支持。但理论上来 ...

大佬 谢谢大佬 膜拜 感激谢谢
页: [1]
查看完整版本: double和float的区别到底是怎么样的