为啥这个除法结果为零?
Posted
技术标签:
【中文标题】为啥这个除法结果为零?【英文标题】:Why does this division result in zero?为什么这个除法结果为零? 【发布时间】:2009-10-14 19:06:48 【问题描述】:当我遇到以下问题时,我正在用 C 编写此代码。
#include <stdio.h>
int main()
int i=2;
int j=3;
int k,l;
float a,b;
k=i/j*j;
l=j/i*i;
a=i/j*j;
b=j/i*i;
printf("%d %d %f %f\n",k,l,a,b);
return 0;
谁能告诉我为什么第一个和第三个变量(k
和 a
)的代码返回零?
【问题讨论】:
您遇到了什么错误?你期望输出是什么?你得到什么输出? 请注意,您使用的是 /n 而不是 \n。这是您的代码的复制粘贴,还是您重新输入了它?最好有一个复制粘贴以避免转录错误。 我已将标题/问题更改为我认为的意图 @therefromhere:您只是在猜测和“解决”问题并不能帮助提问者学习如何提出更好的问题。 (我承认这是非常极端的编辑,但这是初学者的常见错误,我认为值得一试) 【参考方案1】:您是在问为什么 k 和 a 显示为零?这是因为在整数除法中 2/3 = 0(小数部分被截断)。
【讨论】:
扩展,当你写“a =我认为您正在经历的是整数运算。您正确地假设 l
和 b
为 2,但错误地假设 k
和 a
将为 3,因为它是相同的操作。但它不是,它是整数算术(而不是浮点算术)。因此,当您执行i / j
(请考虑使用一些空格)时,2 / 3 = 0.33333...被转换为int
,因此变为 0。然后我们再次乘以 3,和 0 * 3 = 0。
如果您将 i
和 j
更改为 float
s(或在您的数学中添加 (float)
演员表),这将达到您的预期。
【讨论】:
【参考方案3】:您还没有说出您得到什么或期望什么,但在这种情况下,您可能很容易猜到。当您执行 'a=i/j*j' 时,您期望结果大约为 0.2222(即 2/9),但实际上您得到的是 0.0。这是因为 i 和 j 都是 int,所以乘法和(至关重要的)除法是在整数数学中完成的,产生 0。你将结果分配给一个浮点数,这样 0 就会被转换为 0.0f。
要解决此问题,请在除法之前将至少一个操作数转换为浮点数:a = (float)i/j*j);
【讨论】:
【参考方案4】:这是由于 c 编译器如何在除法中处理 int:
#include <stdio.h>
int main()
int i=2;
int j=3;
int k,l;
float a,b;
k=i/j*j; // k = (2/3)*3=0*3=0
l=j/i*i; // l = (3/2)*2=1*2=2
a=i/j*j; // same as k
b=j/i*i; // same as b
printf("%d %d %f %f/n",k,l,a,b);
return 0;
【讨论】:
【参考方案5】:如果您问为什么 k 和 a 为 0:i/j*j
与 (i/j)*j
相同。由于 j 大于 i,i/j
为 0(整数除法)。 0*j
仍为 0,所以结果 (k) 为 0。同样适用于 a 的值。
【讨论】:
【参考方案6】:不管你的变量是不是float,只要你在使用
整数/整数,你会得到0,
但是因为你使用的是浮点输出,所以你得到 0.0
【讨论】:
以上是关于为啥这个除法结果为零?的主要内容,如果未能解决你的问题,请参考以下文章