Una mano por favor , ejercicio de c

Iniciado por kevinlll6, 22 Agosto 2014, 06:54 AM

0 Miembros y 1 Visitante están viendo este tema.

kevinlll6

Hola disculpen estoy empezando en c ,y a la hora de querer compilar este programa , tengo problemas en el área de multiplicación , por ejemplo 4.1*3 deberia dar igual a 12.3 , pero me arroja un resultado 12.29999 , ahora 3.4*1.1
3.74 , pero no lo reconoce , y así hay mas números que fallan , pero no todos , porque sucede esto?

#include <stdio.h>
#include <stdlib.h>


using namespace std;
int main()//Accion Operacion Cuatro cositas
{
   float op1,op2,rpta,res2;
   char op;
   printf("Ingrese la operacion que desee realizar\n");
   printf("Ejemplo: 2 + 3\n \n");
   scanf("%f",&op1);
   scanf("%c",&op);
   scanf("%f",&op2);
   switch(op)
   {
   case '+':
      ;
       printf("\nOPERACION SUMA: \n \n");
       printf("%6.1f + %6.1f =",op1,op2);
       scanf("%f",&rpta);
       if(rpta==op1+op2)
       {
           printf("Felicitaciones!\n");
       }
       else
       {
           printf("Errooooor!\n");
       }
       break;
   case '-':

       printf("\nOPERACION RESTA: \n \n");
       printf("%6.1f - %6.1f =",op1,op2);
       scanf("%f",&rpta);
       if(rpta==op1-op2)
       {
           printf("Felicitaciones!\n");
       }
       else
       {
           printf("Errooooor!\n");
       }
       break;
   case '*':
       res2=op1*op2;
       printf("\nOPERACION MULTIPLICACION: \n \n");
       printf("%6.2f * %6.2f =",op1,op2);
       scanf("%f",&rpta);
       printf("%f \n" ,rpta);
      printf ("%f \n", res2);

       if(rpta==op1*op2)
       {
           printf("Felicitaciones!\n");
       }
       else
       {
           printf("Errooooor!\n");
       }
       break;
   case '/':
       if(op2!=0)
       {
           system("cls");
           printf("\nOPERACION DIVISION: \n \n");
           printf("%6.1f / %6.1f =",op1,op2);
           scanf("%f",&rpta);
           if(rpta==op1/op2)
           {
               printf("Felicitaciones!\n");
           }
           else
           {
               printf("Errooooor!\n");
           }
       }
       else
       {
           printf("\nOPERACION IMPOSIBLE,NO SE PUEDE DIVIDIR ENTRE 0\n");
       }
       break;
   default:
       printf("\nOPERADOR DESCONOCIDO\n");
   }
   system("pause");
   return 0;
}





Caster

#1
Antes de nada, esto va en el foro Programación C/C++.

Estás programando en C, así que esta línea sobra, eso es de C++.
Código (cpp) [Seleccionar]
using namespace std;

Y vamos al problema en sí: las operaciones fallan, creo, por la precisión de los decimales, y digo creo porque no tengo mucha idea sobre el tema. Para solucionarlo prueba a declarar las variables como double en vez de como float.

Otra cosa aparte, en la línea 18 debajo del "case'+':" hay un ";" que creo que tampoco pinta nada ahí.

Saludos.

eferion

Como te dijo Caster, el problema es de precisión.

Quizás, antes de realizar operaciones con decimales deberías aprender cómo se almacenan éstos números y que problemas pueden aparecer.

Los números en coma flotante permiten almacenar números bastante grandes / pequeños incluso con decimales... pero a cambio sacrifica precisión. Si quieres reducir esta pérdida de precisión puedes probar a usar double en vez de float.

printf("%6.1f + %6.1f =",op1,op2);

Tu ahí estás forzando a que en el número se imprima únicamente hasta el primer decimal... pero eso no quiere decir que el número real almacenado en op1 y op2 vayan a tener un número con un decimal... la conversión a coma flotante puede hacer que el número almacenado no sea exactamente el que esperas.

A modo de ejemplo: un float tiene una precisión de 6 dígitos, esto quiere decir que un número, por ejemplo el 1 puede acabar representado dentro del rango 0.999990 y 1.000009. O el número 12.3, este número puede acabar representado por un número cualquiera dentro del rango 12.29990 y 12.30009.

Lo dicho, si esta precisión te da problemas, cambia a double.