在做CS50问题集1-现金时,当我尝试编写代码时,我遇到了以下问题。我已经将变量声明为整数。为什么它还在发生?非常感谢你的帮助。
“二进制表达式的操作数无效('float‘和'float')”
#include <stdio.h>
#include <cs50.h>
#include <math.h>
int main(){
float owe_in_dollars;
float owe_in_cent;
int coin_count = 0;
do
{
owe_in_dollars = get_float("Change: ");
}while(owe_in_dollars<0);
owe_in_cent = (int)(owe_in_dollars*100);
if (owe_in_cent%(int)25 > 0){
coin_count++;
}
printf("%i", coin_count);
}
发布于 2019-04-27 11:20:53
这段代码有几个问题,但我认为产生编译器错误的特定问题是
if (owe_in_cent%(int)25 > 0){
owe_in_cent
是一个float
。没有理由让它是浮点数,因为您已经将它赋给了一个整数值。但是您声明它为float
,所以它就是这样。25
是一个int
,所以没有必要将它转换为int
,但是不管有没有强制转换,它都将被转换为float
,以便使用owe_in_cent
进行算术运算,因为所有算术运算符都要求操作数具有相同的类型。有关详细信息,请搜索“常用算术转换”,但底线是这些自动转换始终是整数整数浮点,决不是浮点整数→→。
然后问题就出现了,因为%
操作符要求它的操作数是整数,而不是浮点数。有一个数学函数可以计算浮点模数,但是你确实需要整数运算,所以你最好的选择是让owe_in_cent
成为int
而不是float
。
实际上,你真的应该养成对浮点值使用double
的习惯。float
是非常不精确的,除了在视频芯片和嵌入式处理器中,使用如此不精确的表示是没有意义的。它不会为你节省任何东西。
最后,请记住关于浮点数的两个重要事实:
,
(int)525.9997
是525,而不是526。您应该能够看到可能产生的问题。有一个名为round
的库函数,它可以将浮点数舍入到最接近的整数,这可能就是您想要的。
https://stackoverflow.com/questions/55876843
复制相似问题