¿Por qué al dividir dos números enteros no se obtiene un valor flotante? [duplicar]
¿Alguien puede explicar por qué b se redondea aquí cuando lo divido por un número entero aunque es un flotante?
#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
Esto se debe a la conversión implícita. Las variables b, c, d
son de float
tipo. Pero el /
operador ve dos números enteros que tiene que dividir y, por lo tanto, devuelve un número entero en el resultado que se convierte implícitamente en a float
mediante la adición de un punto decimal. Si desea divisiones flotantes, intente realizar dos operandos para los /
flotantes. Como sigue.
#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;
}
Utilice la conversión de tipos:
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
}
Esta es otra forma de solucionarlo:
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
}
Sin embargo, en ambos casos le está diciendo al compilador que 350 es un flotante y no un número entero. En consecuencia, el resultado de la división será un número flotante y no un número entero.
"a" es un número entero, cuando se divide con un número entero da un número entero. Luego se asigna a "b" como un número entero y se convierte en flotante.
deberías hacerlo así
b = a / 350.0;
Específicamente, esto no es redondear el resultado, sino truncarlo hacia cero. Entonces, si divides -3/2, obtendrás -1 y no -2. ¡Bienvenidos a las matemáticas integrales! Antes de que las CPU pudieran realizar operaciones de punto flotante o la llegada de los coprocesadores matemáticos, hacíamos todo con matemáticas integrales. Aunque había bibliotecas para matemáticas de punto flotante, eran demasiado caras (en instrucciones de CPU) para fines generales, por lo que utilizamos un valor de 16 bits para la porción entera de un número y otro valor de 16 para la fracción.
EDITAR: mi respuesta me hace pensar en el clásico anciano que dice "cuando tenía tu edad..."