在进行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);
}
答案 0 :(得分:1)
此代码存在多个问题,但我认为产生编译器错误的特定问题是
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
非常不准确,除了在视频芯片和嵌入式处理器中,使用如此不精确的表示没有任何意义。它不会为您节省任何费用。
最后,请记住有关浮点的两个重要事实:
它不能精确表示分母不是2的幂的分数。换句话说,5.25具有精确的表示形式,因为.25是四分之一,是2的幂,但是5.26无法精确表示,最终将是一个稍大于或小于5.26的数字。当您将该数字乘以100时,最终将得到比526略多或略少的东西。
将浮点数强制转换为整数只会丢弃小数部分,无论它接近1.0是多少。因此,例如(int)525.9997
是525,而不是526。您应该能够看到可能产生的问题。
有一个名为round
的库函数,该函数将浮点数四舍五入为最接近的整数,这可能正是您想要的。