C中的华氏换算公式问题
用C编写程序将摄氏度转换为华氏度时,以下公式给出的输出不正确:C中的华氏换算公式问题,c,C,用C编写程序将摄氏度转换为华氏度时,以下公式给出的输出不正确: int fahr = 9 / 5 * celsius + 32; 现在,我了解到9/5被解释为整数可能是一个问题,但我不理解的是,使用double或float仍然会给出同样不正确的输出 奇怪的是,下面的公式给出了正确的输出,尽管还将类型设置为int: int fahr = celsius / 5 * 9 + 32; 此外,我注意到,即使是像下面这样简单的事情,当类型设置为double时,输出仍然是1.0而不是1.8:
int fahr = 9 / 5 * celsius + 32;
现在,我了解到9/5被解释为整数可能是一个问题,但我不理解的是,使用double
或float
仍然会给出同样不正确的输出
奇怪的是,下面的公式给出了正确的输出,尽管还将类型设置为int
:
int fahr = celsius / 5 * 9 + 32;
此外,我注意到,即使是像下面这样简单的事情,当类型设置为double
时,输出仍然是1.0而不是1.8:
double x = 9 / 5;
printf("%lf\n", x);
我读过这个帖子:
但我还是不明白为什么
intfahr=cellices/5*9+32代码>有效,但不int fahr=9/5*摄氏度+32代码>?您正在使用整数进行数学运算。这句话:
9 / 5
int fahr = celsius / 5 * 9 + 32;
int fahr = celsius * 9.0 / 5 + 32;
在C中产生1
。当您说您使用了double
或float
时,您可能只是更改了fahr
的类型,这对assignemtn运算符右侧发生的操作没有任何影响。要获得正确的行为,您还需要将这些常量中的至少一个设置为双倍:
9.0 / 5
同样,在本声明中:
double x = 9 / 5;
您仍在进行整数运算,然后将结果分配给double
变量。没有别的事了。通过执行以下操作之一,您将获得正确答案:
double x = 9.0 / 5;
double x = 9 / 5.0;
double x = 9.0 / 5.0;
使用此表达式的原因:
9 / 5
int fahr = celsius / 5 * 9 + 32;
int fahr = celsius * 9.0 / 5 + 32;
似乎工作只是一个操作顺序的事情-这里你把输入除以5,然后乘以9,而不是先做常量运算。您仍然可以通过以下操作获得更准确的答案:
int fahr = celsius * 9 / 5 + 32;
除此之外,您还可以在以下表达式中进行浮点运算:
9 / 5
int fahr = celsius / 5 * 9 + 32;
int fahr = celsius * 9.0 / 5 + 32;
如果您想使用整数进行原始计算,您当然可以-您只需要在除法之前进行乘法:
int fahr = 9 * celsius / 5 + 32;
此表达式相当于上面使用的表达式之一。每个表达式或子表达式的类型(在大多数情况下)的计算不考虑其出现的上下文
在本宣言中:
double x = 9 / 5;
初始化表达式为9/5
;它由两个int
表达式和一个除法运算符组成。由于/
的操作数属于int
类型,因此它是一个int
除法,产生一个int
值。由于整数除法截断,结果为1
,类型为int
然后使用该表达式的结果初始化x
。由于x
的类型为double
,因此将值从int
隐式转换为double
,从而导致x
保留值1.0
如果希望x
的值为1.8
,则需要进行浮点除法,这意味着需要浮点操作数。最简单、最清晰的方法是:
double x = 9.0 / 5.0;
还有其他几种(不太清楚的)方法。如果一个/
运算符有两个操作数,一个是int
类型,另一个是double
,则int
操作数将升级为double
,因此这两个操作数中的任何一个也将x
设置为1.8
:
double x = 9.0 / 5;
/* or */
double x = 9 / 5.0;
但要注意这种方法:
double y = 9 / 5 / 3.0;
这相当于:
double y = (9 / 5) / 3.0;
它将9/5
计算为int
,得到1
,然后将该结果提升为double
,并将其除以3.0
,得到0.333
关键是,表达式的上下文不会将类型强加给表达式或其操作数;表达式的计算方式就像它是孤立的一样,然后结果可能会根据其上下文进行转换。我仍然不明白为什么int fahr=cellices/5*9+32代码>有效,但不int fahr=9/5*摄氏度+32代码>
对于前者,您可能将摄氏度
声明为浮点
或双精度
,从而使整个右侧都按此方式计算。假设您使用了float
,它的工作原理如下:
celsius / 5 * 9 + 32
(celsius / 5.0) * 9 + 32
(celsius / 5.0 * 9.0) + 32
(celsius / 5.0 * 9.0 + 32.0)
对于后者,9/5
是一种整数算术,其计算结果为1
,然后其他数学运算作为浮点运算。在这种情况下:
9 / 5 * celsius + 32
1 * celsius + 32 // Because of this, you get an incorrect answer
celsius + 32
celsius + 32.0
请注意,左侧的类型与此无关;对右侧进行评估时不考虑这一点
更新:您说的摄氏度
是一个整数
,这意味着您碰巧运气好,用一个5
的倍数进行测试,在对语句的其余部分执行有效的整数运算之前,给您一个正确的整数结果,即摄氏度/5
。在第二个示例中,使用5的倍数对您没有帮助
无论如何,现在你知道你为什么幸运了,但是链接的问题给出了你实际需要做的事情的答案,当摄氏度不是5的倍数时,公式可以工作:使用浮点数学,正如所有答案所示。我理解这一点。请通读这篇文章。@Tanger,我想你不会。为了更好地解释,我进行了编辑。好吧,那么为什么这样做:int fahr=摄氏度/5*9+32?我添加了另一个编辑来涵盖这一点。因为手术是从左到右进行的。好的,谢谢。关于你的陈述“这里你把输入除以5,然后再乘以9,而不是先做常数运算”,我还是有点不清楚,因为我把摄氏度也设为int,所以它实际上只是除以整数,就像9/5一样。你是说用一个整型变量而不是常数是造成差异的原因(即使变量被赋予与常数相同的值)?因为9和5被视为整数。试试9.0/5.0这是一个典型的新手错误。因为真正的男人