为什么划分两个整数不会得到一个浮点数?
任何人都可以解释为什么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, d
是float
型的。 但/
运算符看到两个整数,它必须分开,因此在结果中返回一个整数,通过添加小数点隐式转换为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/b
和a%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。