使用 C 时遇到“二进制表达式的无效操作数('float' 和 'float')”
Facing 'invalid operands to binary expression ('float' and 'float')' while using C
在做 CS50 问题集 1 - 现金时,我在尝试编写代码时遇到了以下问题。我已将变量声明为整数。为什么它仍然发生?非常感谢您的帮助。
"invalid operands to binary expression ('float' and '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);
}
此代码有几个问题,但我认为产生编译器错误的特定问题是
if (owe_in_cent%(int)25 > 0){
owe_in_cent
是一个 float
。它没有理由是浮点数,因为您已将它分配给一个整数值。但是你声明了它float
,所以它就是这样。 25
是一个 int
,因此将它转换为 int
没有意义,但无论是否进行转换,它都会被转换为 float
以便执行owe_in_cent
的算术运算,因为所有算术运算符都要求操作数的类型相同。搜索 "usual arithmetic conversions" 了解详情,但最重要的是,这些自动转换始终是整数 → 浮点数,而不是浮点数 → 整数。
然后问题就出现了,因为%
运算符要求它的操作数是整数,而不是浮点数。有一个可以计算浮点模数的数学函数,但您确实需要整数运算,所以最好的办法是使 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
的库函数可以将浮点数四舍五入为最接近的整数,这可能正是您想要的。
在做 CS50 问题集 1 - 现金时,我在尝试编写代码时遇到了以下问题。我已将变量声明为整数。为什么它仍然发生?非常感谢您的帮助。
"invalid operands to binary expression ('float' and '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);
}
此代码有几个问题,但我认为产生编译器错误的特定问题是
if (owe_in_cent%(int)25 > 0){
owe_in_cent
是一个 float
。它没有理由是浮点数,因为您已将它分配给一个整数值。但是你声明了它float
,所以它就是这样。 25
是一个 int
,因此将它转换为 int
没有意义,但无论是否进行转换,它都会被转换为 float
以便执行owe_in_cent
的算术运算,因为所有算术运算符都要求操作数的类型相同。搜索 "usual arithmetic conversions" 了解详情,但最重要的是,这些自动转换始终是整数 → 浮点数,而不是浮点数 → 整数。
然后问题就出现了,因为%
运算符要求它的操作数是整数,而不是浮点数。有一个可以计算浮点模数的数学函数,但您确实需要整数运算,所以最好的办法是使 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
的库函数可以将浮点数四舍五入为最接近的整数,这可能正是您想要的。