Acumulación en expresión, no entiendo el porque pasa ...

03/12/2005 - 11:23 por Ricard | Informe spam
Hola a todos,

Generé dos tablas una de detalle y otra de total en el mismo dataset a
partir de un archivo de texto.

Las tablas estan relacionadas entre si.

Al obtener el resultado en la columna de total de la tabla total, la
expresión sum de la columna de la tabla de detalle me devuelve un número de
decimales que no están definidos en las lineas de detalle.

Todas las lineas de detalle tienen únicamente dos decimales.
No realizo ninguna operación de cálculo (*,/)
Las columnas están definidas de tipo double

Este comportamiento me sorprende.

Ya sé que aplicando estilos puedo dar el formato que deseo, pero no entiendo
que si el detalle solo tiene dos decimales el agregado me devuelva hasta 7
decimales con valor y no son ceros.


¿Alguien me puede indicar que puede estar pasando?


Gracias por anticipado.

Preguntas similare

Leer las respuestas

#1 Eduardo A. Morcillo [MS MVP VB]
03/12/2005 - 15:41 | Informe spam
El problema es la forma en que se guardan los numeros de punto flotante
(Single y Double) que hace que no se puedan guardar en forma exacta algunos
valores y por lo tanto al realizar calculos pueden obtenerse valores
incorrectos. Por ejemplo, no le es posible representar con exactitud el
valor 100.1 y entonces queda como 100.09999999999999. Para evitar este
problema utiliza el tipo Decimal.

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
http://mvp.support.microsoft.com/pr...4EF5A4191C
Respuesta Responder a este mensaje
#2 A.Poblacion
04/12/2005 - 10:49 | Informe spam
"Ricard" wrote in message
news:
[...] la expresión sum
de la columna de la tabla de detalle me devuelve un número de
decimales que no están definidos en las lineas de detalle.
[...]
Las columnas están definidas de tipo double



Eso te pasa por usar el tipo double en lugar del tipo decimal. El tipo
double es un tipo "impreciso": guarda en binario una mantisa y un exponente
que representan el valor original. Cuando metes valores en tu programa con
dos decimales, los metes en base 10, pero al almacenarse en un double se
convierten a base 2, y la conversión puede no ser exacta, porque hay números
que tienen un número finito de decimales en base 10 pero infinito en base 2.
Ese número infinito de decimales se trunca al almacenarlos, con lo que no
representa exactamente el valor original que introdujiste. Cuando sumas
varios de estos números, se van acumulando las diferencias, y al volver a
convertirlo a base 10 para visualizarlo, salen decimales que originalmente
no estaban.
El remedio es utilizar un valor de tipo Decimal en lugar de Double. El
tipo Decimal sí que se codifica internamente de forma exacta (internamente
guarda un número entero, y un indicador de en qué posición está la coma
dentro de ese número).
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida