Dev - C++ - Ayuda en resta de entero y float

 
Vista:
sin imagen de perfil

Ayuda en resta de entero y float

Publicado por Ignacio Raúl (3 intervenciones) el 23/09/2018 19:15:26
Qué tal, pues como lo dice el título tengo un problema con el siguiente código:

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
float X;
int Y;
using namespace std;
main ()
{
  cin>>X; //X es un número con decimales
  Y=X; //se le asigna la parte entera de X a Y
  X = X-Y; //se restan ambos para obtener un 0,decimal
  cout<<X; //se debería mostrar ese 0,***
 return 0;
}

El problema está en que , por ejemplo si ingreso123.02, y lo resto con 123, sale 0.1999... en vez de 0.2.
Alguien sabe porque pasa, y cómo arreglarlo?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 338
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda en resta de entero y float

Publicado por Martín (158 intervenciones) el 24/09/2018 01:55:29
Dos comentarios previos:
- main devuelve int; debe ser: int main() { ... }
- al convertir un float a int se prefiere poner en forma explícita: Y = static_cast<int>(X); para aclarar que es una conversión deliberada y no accidental.

El resultado que obtienes no es un error, no hay nada que arreglar, es el resultado normal al trabajar con tipos en coma flotante (float, double, long double, etc.). Sucede que cada uno de estos tipos tiene una representación estándar en base 2, y cuando un número racional en base 10 tiene una representación exacta, no necesariamente va a tener una representación exacta cuando se expresa en base 2, y viceversa.

Por ejemplo: el racional 1/3 (base 10) es 0,333333.... con infinitos 3 periódicos, y cuando necesitamos escribirlo elegimos una representación aproximada, fijando un número aceptable de decimales; si se trata de dinero, con decir 0.33 puede ser razonable, mientras que si se trata de una medida científica, quizá se escriba con más decimales, pero siempre va a ser una representación aproximada, 1/3 no tiene representación decimal exacta.

Bueno, lo mismo pasa cuando la base de numeración es 2 (como en tu computadora); hay números racionales que no tienen representación binaria exacta y cuando se representan en base 10 (la salida de cout que estás viendo, por ejemplo), esa aproximación se hace evidente.

Como ves no es un error, es la naturaleza misma de los números racionales y su representación como números decimales o binarios (o la base que sea).

Para comprender cómo funciona la representación de números decimales en tu computadora puedes leer uno de los últimos artículos bien escritos que quedan en:
https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 1.440
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda en resta de entero y float

Publicado por dario (718 intervenciones) el 24/09/2018 06:06:29
Hola, reemplaza tu linea 9 con esto: X = int(X-Y); //se restan ambos para obtener un 0,decimal. Asi como dice Martin tienes que convertirlo en forma explicita.
Salu2.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda en resta de entero y float

Publicado por Ignacio Raúl (3 intervenciones) el 25/09/2018 03:19:51
Martín, cómo he visto, ya entiendo Mas o menos como funciona, pero no encuentro solución a lo de la resta, hay alguna manera de que me saque el decimal sin aproximaciones(en este caso el 0.2)?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 338
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda en resta de entero y float

Publicado por Martín (158 intervenciones) el 25/09/2018 05:16:02
"Lo de la resta" no tiene solución, simplemente porque no es un problema. Se trata de una convención, un acuerdo entre los que se comunican; en este caso ese acuerdo lo debes establecer con el usuario de tu programa.

¿Con cuántos decimales exactos quiere la respuesta?

Dependiendo de lo que te digan podrás usar float, double, long double o alguna biblioteca especializada en cómputos numéricos de alta precisión. https://en.wikipedia.org/wiki/List_of_arbitrary-precision_arithmetic_software

Algunas veces, cuando se trata de dinero, por ejemplo, se conviene en usar sólo enteros; por ejemplo, 123,02 pasaría a ser 123020 (milésimas de la unidad).

También, para mostrar el resultado con un número particular de decimales, cout tiene la función miembro precision() https://en.cppreference.com/w/cpp/io/ios_base/precision

En este caso en particular, para mostrar el resultado con un máximo de 4 decimales, se puede poner:

1
cout.precision(4);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar