Matemáticas con Doubles.

21/07/2003 - 12:20 por Jose Carlos | Informe spam
Estoy sumamente extrañado, y no se si será por algun mal uso que hago al
operar.

double restaAux = 4199059.27 - 4191043.27;

y el resultado es 8015.9999999995343 en vez de 8016.

Que ocurre? los double no operan con precisión? Se debe operar de otra
manera. Gracias.

Jose Carlos.

PD: Pudiera parecer este error cuantitativamente insignificante, pero
cualitativamente es importante, pues a veces lo importante es saber si el
resultado es entero o no. Y en este caso engaña.

Preguntas similare

Leer las respuestas

#1 Tako
21/07/2003 - 12:32 | Informe spam
Prueba con esto:

Decimal restaAux = (decimal)4199059.27 - (decimal)4191043.27;

y echa un vistazo a los números "Decimal" para ver por que te pasaba eso
;)

"Jose Carlos" wrote in message
news:
Estoy sumamente extrañado, y no se si será por algun mal uso que hago al
operar.

double restaAux = 4199059.27 - 4191043.27;

y el resultado es 8015.9999999995343 en vez de 8016.

Que ocurre? los double no operan con precisión? Se debe operar de otra
manera. Gracias.

Jose Carlos.

PD: Pudiera parecer este error cuantitativamente insignificante, pero
cualitativamente es importante, pues a veces lo importante es saber si el
resultado es entero o no. Y en este caso engaña.




Respuesta Responder a este mensaje
#2 Octavio Hernández
21/07/2003 - 13:45 | Informe spam
Jose Carlos,

Es totalmente lógico que te ocurra eso con doubles, más teniendo en cuenta
los valores que utilizas, con 9 cifras significativas. Si necesitas una
precisión superior, utiliza el tipo decimal. Además, indica explícitamente
que las constantes deben ser decimales con el sufijo M:

Decimal restaAux = 4199059.27M - 4191043.27M;

Salu2,

Octavio

"Jose Carlos" escribió en el mensaje
news:
Estoy sumamente extrañado, y no se si será por algun mal uso que hago al
operar.

double restaAux = 4199059.27 - 4191043.27;

y el resultado es 8015.9999999995343 en vez de 8016.

Que ocurre? los double no operan con precisión? Se debe operar de otra
manera. Gracias.

Jose Carlos.

PD: Pudiera parecer este error cuantitativamente insignificante, pero
cualitativamente es importante, pues a veces lo importante es saber si el
resultado es entero o no. Y en este caso engaña.




Respuesta Responder a este mensaje
#3 tristan
21/07/2003 - 13:59 | Informe spam
Aparte de lo que te han dicho ya, ten en cuenta que
Double es un tipo de coma flotante. Estos números se
representan y operan en binario. El problema lo tienes en
la conversión de decimal a binario. Un número
representable de forma exacta en decimal, no tiene por
que serlo en binario y viceversa.

Si necesitas precisión decimal, utiliza el tipo decimal.
Respuesta Responder a este mensaje
#4 Tristan
22/07/2003 - 09:42 | Informe spam
Porque va el décimal mucho más lento?. por su prpia


definición.?


Ten en cuenta que int, es un tipo nativo del procesador.
Las operaciones basicas sobre int se realizan en un solo
ciclo de reloj!!. Por el contrario, desconozco como se
manipula decimal, pero en el mejor de los casos, a través
del coprocesador, e incluso no me extrañaría que fuese
por sofware.
Respuesta Responder a este mensaje
#5 Octavio Hernández
22/07/2003 - 11:05 | Informe spam
Jose Carlos,

Es por su propia definición. El tipo Decimal en principio está pensado para
cálculos financieros que requieren precisión absoluta (bueno, casi - 28
dígitos decimales). Por lo que decía Tristán de la no exactitud de las
conversiones binario-decimal, el número se representa directamente en
decimal y las operaciones se hacen directamente sobre esa representación.
Puedes ver los detalles de la representación interna aquí:

http://msdn.microsoft.com/library/d...stopic.asp

Salu2,

Octavio

"Jose Carlos" escribió en el mensaje
news:
Ok. Gracias. Con decimal todo, funciona bien. Pero operar con decimal si
embargo es muchisimo más lento.


Para no perder velocidad creo que lo mejor es;
si se puede conocer el orden de las precisiones a tratar, creo que lo


mejor
es trabajar multiplicando por el orden de precisión a trabajar y operar


con
enetros. Luego ya se dividirá.

Porque va el décimal mucho más lento?. por su prpia definición.?

Jose Carlos.

"tristan" escribió en el mensaje
news:07bc01c34f7f$98aecfa0$
Aparte de lo que te han dicho ya, ten en cuenta que
Double es un tipo de coma flotante. Estos números se
representan y operan en binario. El problema lo tienes en
la conversión de decimal a binario. Un número
representable de forma exacta en decimal, no tiene por
que serlo en binario y viceversa.

Si necesitas precisión decimal, utiliza el tipo decimal.


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida