鱼C论坛

 找回密码
 立即注册
查看: 1981|回复: 18

[已解决]数据类型把float改成double导致输出结果不同

[复制链接]
发表于 2023-5-2 22:57:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>

int main()
{
        float fah, cel;

        printf("请输入华氏度:");
        scanf("%f", &fah);

        cel = (fah - 32) * 5 / 9;
        printf("转换为摄氏度是:%.2f\n", cel);

        return 0;
}

这是为什么呀
谢谢大佬!
最佳答案
2023-5-2 22:59:14
你把 float 换成 double 后格式化也要跟着换才行,double 即 long float ,格式化用 %lf

scanf("%lf", &fah);
printf("转换为摄氏度是:%.2lf\n", cel);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-2 22:59:14 | 显示全部楼层    本楼为最佳答案   
你把 float 换成 double 后格式化也要跟着换才行,double 即 long float ,格式化用 %lf

scanf("%lf", &fah);
printf("转换为摄氏度是:%.2lf\n", cel);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-2 22:59:47 | 显示全部楼层
isdkz 发表于 2023-5-2 22:59
你把 float 换成 double 后格式化也要跟着换才行

scanf("%lf", &fah);
发表于 5 秒前

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-2 23:01:21 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-2 23:11:17 | 显示全部楼层
这是一个使用C语言编写的华氏度与摄氏度转换的程序。它接收用户输入的华氏度,通过数学公式将其转换为摄氏度并输出结果。

程序中定义了两个变量fah和cel,分别用来存储用户输入的华氏度和计算出的摄氏度。通过printf函数向用户输出提示信息,让用户输入华氏度。然后使用scanf函数接收用户输入的华氏度,并把它存储在fah变量中。接下来,使用数学公式将华氏度转换为摄氏度,并把结果存储在cel变量中。最后,使用printf函数输出转换后的结果。

具体来说,这个转换公式是:C = (F - 32) * 5 / 9 ,其中F代表华氏度,C代表摄氏度。通过该公式,程序将输入的华氏度转换为摄氏度,并保留两位小数输出。
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-2 23:21:04 From FishC Mobile | 显示全部楼层
isdkz 发表于 2023-5-2 22:59
你把 float 换成 double 后格式化也要跟着换才行,double 即 long float ,格式化用 %lf

scanf("%lf", & ...

%f 就是 printf 里 double 用的,没有 %lf 这种 conversion specification( l 修饰无效果)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-2 23:28:25 | 显示全部楼层
dolly_yos2 发表于 2023-5-2 23:21
%f 就是 printf 里 double 用的,没有 %lf 这种 conversion specification( l 修饰无效果)


不是吧,我记得就是用 %lf 的,你说没有效果可能是因为没有超出 float 的表示范围
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-2 23:34:44 From FishC Mobile | 显示全部楼层
isdkz 发表于 2023-5-2 23:28
不是吧,我记得就是用 %lf 的,你说没有效果可能是因为没有超出 float 的表示范围

也许值得参考,但愿链接是正确的
https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3047.pdf#subsubsection.7.23.6.1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-2 23:38:14 | 显示全部楼层
dolly_yos2 发表于 2023-5-2 23:34
也许值得参考,但愿链接是正确的
https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3047.pdf#subsubs ...

这里 double 就是用的 %lf 呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-2 23:42:22 From FishC Mobile | 显示全部楼层
isdkz 发表于 2023-5-2 23:38
这里 double 就是用的 %lf 呀

l: […], or has no effect on a following a, A, e, E, f, F, g, or G conversion specifier.
所以哪里用的 %lf?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-2 23:51:28 | 显示全部楼层
dolly_yos2 发表于 2023-5-2 23:42
l: […], or has no effect on a following a, A, e, E, f, F, g, or G conversion specifier.
所以哪里 ...

你确定你发的那个链接有这句?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-2 23:58:00 | 显示全部楼层
dolly_yos2 发表于 2023-5-2 23:21
%f 就是 printf 里 double 用的,没有 %lf 这种 conversion specification( l 修饰无效果)

好吧,是我才疏学浅了

我问了 gpt,你是对的

截图20230502235618.png

感谢指正
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-3 07:13:30 | 显示全部楼层
isdkz 发表于 2023-5-2 23:58
好吧,是我才疏学浅了

我问了 gpt,你是对的

你这是官网?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-3 07:14:03 | 显示全部楼层


对呀,咋了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-3 07:17:18 | 显示全部楼层

买不起呜呜呜
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-3 12:11:00 | 显示全部楼层
scanf("%lf", &fah);
printf("转换为摄氏度是:%.2f\n", cel);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-3 14:37:57 | 显示全部楼层
isdkz 发表于 2023-5-2 22:59
你把 float 换成 double 后格式化也要跟着换才行,double 即 long float ,格式化用 %lf

scanf("%lf", & ...

谢谢! 我还想问就是为什么我格式不对它不是报错而是输出一个错的结果呢
比如我输入45, 它会输出-17.78,这个-17.78是怎么来的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-3 14:40:08 | 显示全部楼层
ynnh 发表于 2023-5-3 14:37
谢谢! 我还想问就是为什么我格式不对它不是报错而是输出一个错的结果呢
比如我输入45, 它会输出-17.78 ...

当你使用不匹配的格式说明符时,例如在这种情况下使用 %f 读取 double 类型的变量,C 语言的行为是未定义的。这意味着结果可能是任何值,并且可能在不同的编译器或运行时环境下表现不同。

在你的例子中,输入 45 时得到的 -17.78 的原因是由于格式说明符不匹配导致内存中的值被错误地解释。这可能是因为编译器在处理输入时将 double 类型的值存储在内存的某个位置,而 %f 期望的是一个 float 类型的值。由于 float 和 double 的内部表示方式不同,这就导致了错误的结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-5-3 14:43:03 | 显示全部楼层
dolly_yos2 发表于 2023-5-2 23:42
l: […], or has no effect on a following a, A, e, E, f, F, g, or G conversion specifier.
所以哪里 ...

但是!!我去改了代码, 结果是对的!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 20:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表