谁能解释为什么当我将它除以一个整数时,为什么 b 会被四舍五入,尽管它是一个浮点数?
#include <stdio.h>
void main() {
int a;
float b, c, d;
a = 750;
b = a / 350;
c = 750;
d = c / 350;
printf("%.2f %.2f", b, d);
// output: 2.00 2.14
}
谁能解释为什么当我将它除以一个整数时,为什么 b 会被四舍五入,尽管它是一个浮点数?
#include <stdio.h>
void main() {
int a;
float b, c, d;
a = 750;
b = a / 350;
c = 750;
d = c / 350;
printf("%.2f %.2f", b, d);
// output: 2.00 2.14
}
这是因为隐式转换。变量b, c, d
是float
类型的。但是/
运算符看到它必须相除的两个整数,因此在结果中返回一个整数,该整数float
通过添加小数点隐式转换为 a。如果您想要浮点除法,请尝试将两个操作数设为/
浮点数。如下。
#include <stdio.h>
int main() {
int a;
float b, c, d;
a = 750;
b = a / 350.0f;
c = 750;
d = c / 350;
printf("%.2f %.2f", b, d);
// output: 2.14 2.14
return 0;
}
使用类型转换:
int main() {
int a;
float b, c, d;
a = 750;
b = a / (float)350;
c = 750;
d = c / (float)350;
printf("%.2f %.2f", b, d);
// output: 2.14 2.14
}
这是解决该问题的另一种方法:
int main() {
int a;
float b, c, d;
a = 750;
b = a / 350.0; //if you use 'a / 350' here,
//then it is a division of integers,
//so the result will be an integer
c = 750;
d = c / 350;
printf("%.2f %.2f", b, d);
// output: 2.14 2.14
}
但是,在这两种情况下,您都在告诉编译器 350 是浮点数,而不是整数。因此,除法的结果将是浮点数,而不是整数。
“a”是一个整数,当除以整数时,它会给你一个整数。然后将它作为整数分配给“b”并成为浮点数。
你应该这样做
b = a / 350.0;
具体来说,这不是四舍五入你的结果,而是向零截断。所以如果你除以 -3/2,你会得到 -1 而不是 -2。欢迎来到积分数学!早在 CPU 可以进行浮点运算或数学协处理器出现之前,我们就用积分数学来完成所有事情。尽管有用于浮点数学的库,但它们对于一般用途来说过于昂贵(在 CPU 指令中),因此我们对数字的整个部分使用 16 位值,对小数使用另一个 16 位值。
编辑:我的回答让我想起了经典的老人说“当我像你这个年纪......”
6.5.5 乘法算子
...
6 当整数被除法时,/
算子的结果是去掉任何小数部分的代数商。105)如果商a/b
是可表示的,则表达式(a/b)*b + a%b
应等于a
;否则,两者的行为a/b
和a%b
是未定义的。
105) 这通常被称为“向零截断”。
整数除以整数给出整数结果。1/2 产生 0;将此结果分配给浮点变量会得到 0.0。要获得浮点结果,至少有一个操作数必须是浮点类型。 b = a / 350.0f;
应该给你你想要的结果。
可能最好的原因是因为0xfffffffffffffff/15
会给你一个可怕的错误答案......
将两个整数相除将得到一个整数(整数)结果。
您需要将一个数字转换为浮点数,或为其中一个数字添加小数,例如 a/350.0。