C sharp - Precisión en C#

 
Vista:

Precisión en C#

Publicado por Oscar Arias (25 intervenciones) el 19/08/2004 14:43:14
Hola, estoy experimentando problemas con los nros flotantes en C#. Tengo una serie de variables que definí double.
double a = 123.3
double b = 123.4
double r = 0.1
Cuando pongo estas variables en un for y hago:
for ( x=a; x<=d;x+=r){...}
lo comico es que en lugar de darme para x
123.4 - 123.5 -123.6 ....
Me da
123.4 - 123.499999999996 - 123.599999999944999 ....
Siendo una operación tan tonta, que estoy haciendo mal para que me de este resultado erróneo? Debería utilizar otro tipo de variable?
Gracias
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

RE:Precisión en C#

Publicado por Edgar (278 intervenciones) el 19/08/2004 15:43:16
Hola

De verdad que es muy extraño el error... intenta colocar el caracter R depues de cada número a ver que tal... sería algo asi

double a = 123.3R
double b = 123.4R
double r = 0.1R

Si no te funciona, intenta colocandolo como Decimal

saludos
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: 158
Bronce
Ha disminuido 1 puesto en C sharp (en relación al último mes)
Gráfica de C sharp

RE:Precisión en C#

Publicado por Yamil Bracho (1164 intervenciones) el 19/08/2004 19:22:53
La operacion la esta haciendo bien...! El problema es que te esta mostrando la precision con la que la esta haciendo. Seria cuestion simplemente de formatear el numero para mostrarlo como deseas.
POr otra parte el sufijo R no existe. En C# tienes dos numeros de punto flotaente, los float y los double.
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

RE:Precisión en C#

Publicado por Oscar Arias (25 intervenciones) el 19/08/2004 19:34:33
El problema es que esos valores calculados son usados como entrada a otros procedimientos, no como visualización.
Si deseara formatearlo, para que el valor diera lo que corresponde por logica, tendría que usar Round?, tengo que tener en cuenta que en principio no se si los valores almacenados en las variables tendrian 1,2,3,4...7 decimales y para mi algoritmo, la precision del valor es fundamental. Es decir, si al sumar "r" con "b" el resultado da 132.2, ese valor esta ok, 132.19999, arruina la operacion.
Tengo otro tipo de datos de precision más pobre que tome 5 o 6 decimales pero donde las sumas no estuvieran afectadas por el tema de la precision?
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

RE:Precisión en C#

Publicado por Edgar (278 intervenciones) el 19/08/2004 19:43:20
Hola

Una pregunta.. los valores que mostraste en el ejemplo anterior son calculados o los asignaste tu en el programa?? ya que de ser asi no hay error alguno en el cálculo, y para hacer lo que quieres deberias usar entonces el Round.. claro que tienes un gran problema al no saber cuantos decimales vas a manejar

Otro tipo de datos, tienes el float, este tiene menos precisión que el double, pero es posible que tengas el mismo problema

Saludos
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

RE:Precisión en C#

Publicado por Oscar Arias (25 intervenciones) el 19/08/2004 20:02:37
Hola, los valores son asignados por el usuario antes del for. El problema es que el for no funciona como esperaria. Quiero decir que al sumar
x+=r, siendo los valores de x y r los especificados, el resultado usa tecnicas de conversion de punto flotante que dan valores incorrectos:
123.3 + 0.1 debe dar 123.4 no 123.3999999999459
123.35 + 0.15 debe dar 123.50 no 123.4999999999459 o 123.5111190
123.354 + 0.001 debe dar 123.355 no 123.354999999999459 o 123.355111190
Se que esos son problemas de la forma de manejo del punto flotante y el doble precision, pero introducen un ruido en los calculos que destroza mi algoritmo. Necesito que en esta parte C# se comporte como una calculadora comun. Por ello pregunto si no hay otro tipo de datos. Tambien aqui puse dos o tres ejemplos de posibles entradas que pudieran venir. Mientras escribo no tengo a mano el VC#, pero en el round, yo debo agregar un valor que me diga cuantos decimales necesito?
Es decir, si el valor informado es
123.43999999999459 y necesito que el valor resultante fuera 123.44, redondear a 123.4 me daria valores erroneos, igual que redondearlo a 123.4.
Se entiende mi dilema?.
Gracias

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

RE:Precisión en C#

Publicado por Edgar (278 intervenciones) el 19/08/2004 21:42:33
Hola

El método Round si tiene una implementación a la que le pasas 2 parámetros, el primero es el valor y el segundo es el número de decimales a los que deseas redondear.

Saludos
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: 158
Bronce
Ha disminuido 1 puesto en C sharp (en relación al último mes)
Gráfica de C sharp

RE:Precisión en C#

Publicado por Yamil Bracho (1164 intervenciones) el 20/08/2004 16:18:42
Oscar, los calculos deberias hacerlo con todos los decimales y si
redondeas 123.3999999999459 a un decimal te da 123.4 que es lo que quieres. Les repito el problema es simplemente como lo esta mostrando porque en las operaciones lo esta haciendo a la precision debida
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

RE:Precisión en C#

Publicado por Oscar Arias (25 intervenciones) el 07/09/2004 14:56:02
A todos gracias. Lo resolvi utilizando el tipo "decimal" en lugar de los float y me hizo todos los calculos correctamente.
Saludos
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