1

estoy siguiendo una guía de programación en C, y he decidido salirme un momento del guión para hacer mi propio código para un ejercicio

Lo que no entiendo es porqué siempre me devuelve un valor entero (24 si no modifico el código) cuando el compilador con el código de solución del ejercicio (que además incluye funciones scanf, así que "es más complicado") puede dar números decimales

El código en cuestión en este:

#include <stdio.h>

int main()
{
    double temporadas, capitulos, duracion, intro, total;

    temporadas = 2;
    capitulos = 8;
    duracion = 60;
    intro = 1;
    total = 2 * 8 * (60-1) / 60;
    printf("El total de horas que has invertido viendo The OA ha sido de %.2lf\n", total);
    return 0;
}

Muchas gracias por la ayuda. No soy principiante en la informática, ni mucho menos, pero nunca me he puesto a programar, y he empezado por C para después "ir cuesta abajo" cuando vaya a Python, por ejemplo xD

Trauma
  • 25,297
  • 4
  • 37
  • 60
Kevin
  • 13
  • 4
  • Muchísimas gracias Trauma, ha funcionado, y de paso me has enseñado cosas que no sabía :) Un abrazo, y gracias, de verdad ^^ – Kevin Apr 07 '19 at 18:17

1 Answers1

5

Veamos tu código:

double total;

Ok. Declaras una variable de tipo double, es decir, en coma flotante. Seguimos:

total = 2 * 8 * (60-1) / 60;

Esto se divide en 2 instrucciones:

  1. Evaluación de lo situado a la derecha del signo =:

    2 * 8 * (60-1) / 60;
    

    Estás evaluando una expresión aritmética con números enteros.

  2. Asignación. El resultado anterior es copiado a la variable total. Si es necesario, dicho resultado se adapta al tipo de la variable.

    total = resultado-anterior;
    

Pues ya tenemos el problema ... las operaciones las estás realizando siempre con enteros, que no soportan decimales.Es al final de la evaluación, cuando ya tienes un resultado, cuando éste se transforma al tipo destino, en tu caso, a double.

Simplemente, usa números en coma flotante para la expresión matemática:

total = 2.0 * 8.0 * (60.0 - 1.0 ) / 60.0;

Podemos simplificar un poco, y de paso ganando precisión: podemos dejar esa conversión para cuando realmente la necesitemos (es decir, cuando sepamos o esperemos que se producirán números decimales):

total = ( 2 * 8 * ( 60 - 1 ) ) / 60.0;
Trauma
  • 25,297
  • 4
  • 37
  • 60