ynnh 发表于 2023-5-2 22:57:08

数据类型把float改成double导致输出结果不同

#include <stdio.h>

int main()
{
      float fah, cel;

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

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

      return 0;
}

这是为什么呀
谢谢大佬!

isdkz 发表于 2023-5-2 22:59:14

你把 float 换成 double 后格式化也要跟着换才行,double 即 long float ,格式化用 %lf

scanf("%lf", &fah);
printf("转换为摄氏度是:%.2lf\n", cel);

歌者文明清理员 发表于 2023-5-2 22:59:47

isdkz 发表于 2023-5-2 22:59
你把 float 换成 double 后格式化也要跟着换才行

scanf("%lf", &fah);


发表于 5 秒前
{:10_266:}

isdkz 发表于 2023-5-2 23:01:21

歌者文明清理员 发表于 2023-5-2 22:59


{:10_299:}

sfqxx 发表于 2023-5-2 23:11:17

这是一个使用C语言编写的华氏度与摄氏度转换的程序。它接收用户输入的华氏度,通过数学公式将其转换为摄氏度并输出结果。

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

具体来说,这个转换公式是:C = (F - 32) * 5 / 9 ,其中F代表华氏度,C代表摄氏度。通过该公式,程序将输入的华氏度转换为摄氏度,并保留两位小数输出。
有用请设置最佳答案

dolly_yos2 发表于 2023-5-2 23:21:04

isdkz 发表于 2023-5-2 22:59
你把 float 换成 double 后格式化也要跟着换才行,double 即 long float ,格式化用 %lf

scanf("%lf", & ...

%f 就是 printf 里 double 用的,没有 %lf 这种 conversion specification( l 修饰无效果)

isdkz 发表于 2023-5-2 23:28:25

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

不是吧,我记得就是用 %lf 的,你说没有效果可能是因为没有超出 float 的表示范围

dolly_yos2 发表于 2023-5-2 23:34:44

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

isdkz 发表于 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 呀

dolly_yos2 发表于 2023-5-2 23:42:22

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?

isdkz 发表于 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.
所以哪里 ...

你确定你发的那个链接有这句?

isdkz 发表于 2023-5-2 23:58:00

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

好吧,是我才疏学浅了{:10_277:}

我问了 gpt,你是对的



感谢指正{:5_106:}

陶远航 发表于 2023-5-3 07:13:30

isdkz 发表于 2023-5-2 23:58
好吧,是我才疏学浅了

我问了 gpt,你是对的


你这是官网?

isdkz 发表于 2023-5-3 07:14:03

陶远航 发表于 2023-5-3 07:13
你这是官网?

对呀,咋了?

陶远航 发表于 2023-5-3 07:17:18

isdkz 发表于 2023-5-3 07:14
对呀,咋了?

买不起呜呜呜

18234831675 发表于 2023-5-3 12:11:00

scanf("%lf", &fah);
printf("转换为摄氏度是:%.2f\n", cel);

ynnh 发表于 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是怎么来的

isdkz 发表于 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 的内部表示方式不同,这就导致了错误的结果。

ynnh 发表于 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.
所以哪里 ...

但是!!我去改了代码, 结果是对的!
页: [1]
查看完整版本: 数据类型把float改成double导致输出结果不同