为什么划分两个整数不会得到一个浮点数?

任何人都可以解释为什么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 } 

http://codepad.org/j1pckw0y

这是因为隐式转换。 variablesb, c, dfloat型的。 但/运算符看到两个整数,它必须分开,因此在结果中返回一个整数,通过添加小数点隐式转换为float 。 如果你想浮点数的话,可以尝试把两个操作数改为/ float。 如下所示。

 #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; } 

使用types的铸造 :

 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; 

章节和经文

6.5.5乘法运算符

6当整数分开时, /运算符的结果是舍弃任何小数部分的代数商。 105)如果商a/b可表示,则expression式(a/b)*b + a%b应等于a ; 否则, a/ba%b的行为是不确定的。


105)这通常被称为“向零截断”。

用整数除整数给出整数结果。 1/2收益率为0; 将这个结果分配给一个浮点variables给出0.0。 要获得浮点结果,至less有一个操作数必须是浮点types。 b = a / 350.0f; 应该给你你想要的结果。

具体来说,这不是四舍五入你的结果,它被截断为零。 所以,如果你分-3/2,你会得到-1而不是-2。 欢迎来到积分math! 在CPU可以做浮点运算或math协处理器的出现之前,我们用积分math做了所有的事情。 尽pipe有浮点math库,但是它们在CPU指令中的花费太高(因为它是一般用途的),所以我们用一个16位的数字来表示一个数字的整个部分,另外一个16位的数值用来表示分数。

编辑:我的答案让我想起经典老人说:“当我是你的年龄…”

可能最好的原因是因为0xfffffffffffffff/15会给你一个可怕的错误答案…

划分两个整数将得到一个整数(整数)的结果。

您需要将一个数字转换为浮点数,或者将一个小数点添加到其中一个数字中,如/ 350.0。