¿Por qué el resultado de esta división en cero?
-
21-09-2019 - |
Pregunta
estaba escribiendo este código en C, cuando me encontré con el siguiente problema.
#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;
}
Puede alguien decirme por qué el código se vuelve cero para el primer y tercer variables (k
y a
)?
Solución
Lo que creo que está experimentando es aritmética de enteros . Supones correctamente l
y b
a ser 2, pero incorrectamente suponer que k
y a
será de 3, porque es la misma operación. Pero no lo es, es la aritmética de enteros (en lugar de aritmética de punto flotante). Así que cuando lo hace i / j
(por favor, considere el uso de algunos espacios en blanco), 2/3 = 0.33333 ... , que se convierte en una int
y por lo tanto se convierte en 0. Luego multiplicamos por 3 otra vez, y 0 * 3 = 0.
Si cambia i
y j
ser float
s (o pimienta de matemáticas con su lanza (float)
), esto va a hacer lo que usted espera.
Otros consejos
¿Usted está preguntando por qué k y un espectáculo como cero? Esto es porque en la división de enteros 2/3 = 0 (la parte fraccionaria se trunca).
Usted no ha dicho lo que está recibiendo o lo que se espera, pero en este caso es probable que sea fácil de adivinar. Cuando lo haga 'a = i / j * j', se está esperando que el resultado sea más o menos 0,2222 (es decir, 2/9), pero en lugar de que está recibiendo 0.0. Esto se debe a i y j son ambos de la INT, por lo que la multiplicación y la división (crucialmente) se realizan en matemáticas número entero, produciendo 0. Se asigna el resultado a un flotador, de manera que 0 se convierte después en 0.0f.
Para solucionarlo, convertir al menos un operando de punto flotante antes de la división: a = (float)i/j*j);
Esto es debido a cómo los compilador trata Cint en las divisiones:
#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;
}
Si usted está preguntando por qué k y a son 0: i/j*j
es la misma que (i/j)*j
. Desde j es mayor que i, i/j
es 0 (división entera). 0*j
todavía es 0, por lo que el resultado (k) es 0. Lo mismo se aplica al valor de a.
no importa si usted es variable es flotante o no, siempre que estés utilizando
número entero / entero, obtendrá 0,
sino porque está utilizando una salida de flotación, se obtiene 0.0