Redondeos incorrectos en sumas

20/04/2005 - 11:47 por Baldor | Informe spam
Tengo el siguiente problema. Al sumar dos importes que transformo
previamente a Double, el resultado no es exacto. El caso es el siguiente,
hago esta comparación y se cumple, cuando no debería:

txtImporte1.Text = "67,62"
txtImporte2.Text = "65,32"
txtImporte3.Text = "2,30"
If cdbl(txtImporte1.Text) <> cdbl(txtImporte2.Text) +
cdbl(txtImporte3.Text) then
'La ejecución pasa por aquí, por la suma de la parte derecha da como
resultado 67.61999999,
' en lugar de dar 67.62 como debería ser
' Pero tanto cdbl(txtImporte2.Text) como cdbl(txtImporte3.Text) dan
un resultado correcto por
' separado. Es al sumarlos cuando ocurre el problema

end if

¿Hay algun problema con la funcion Cdbl()? ¿Debo usar otra? ¿Que es lo
que pasa?

Preguntas similare

Leer las respuestas

#1 A.Poblacion
20/04/2005 - 14:11 | Informe spam
"Baldor" wrote in message
news:
Tengo el siguiente problema. Al sumar dos importes que transformo
previamente a Double, el resultado no es exacto. El caso es el siguiente,
hago esta comparación y se cumple, cuando no debería:

txtImporte1.Text = "67,62"
txtImporte2.Text = "65,32"
txtImporte3.Text = "2,30"
If cdbl(txtImporte1.Text) <> cdbl(txtImporte2.Text) +
cdbl(txtImporte3.Text) then
'La ejecución pasa por aquí, por la suma de la parte derecha da


como
resultado 67.61999999,
' en lugar de dar 67.62 como debería ser
' Pero tanto cdbl(txtImporte2.Text) como cdbl(txtImporte3.Text)


dan
un resultado correcto por
' separado. Es al sumarlos cuando ocurre el problema

end if

¿Hay algun problema con la funcion Cdbl()? ¿Debo usar otra? ¿Que es lo
que pasa?




Efectivamente, hay un problema con CDbl. Esa función devuelve un
double, que no es una representación decimal exacta, sino que convierte a
binario el valor decimal y puede perder precisión en los redondeos, cuando
usas un valor decimal que tiene "infinitos" decimales en base dos.

Te sugiero que en lugar de convertir al tipo Double utilices el tipo
Decimal, que sí que usa una representación exacta de los valores decimales:
If Decimal.Parse(txtImporte1.Text) <> Decimal.Parse(txtImporte2.Text) +
Decimal.Parse(txtImporte3.Text) then ...
Respuesta Responder a este mensaje
#2 Baldor
20/04/2005 - 16:00 | Informe spam
Gracias por la explicación.

¿Que tal si uso CDec en lugar de Cdbl?

Si hago un Buscar/Reemplazar de Cdbl por CDec en la totalidad de mi
proyecto, ¿crees que podría tener algún problema?

"A.Poblacion" escribió en
el mensaje news:
"Baldor" wrote in message
news:
Tengo el siguiente problema. Al sumar dos importes que transformo
previamente a Double, el resultado no es exacto. El caso es el siguiente,
hago esta comparación y se cumple, cuando no debería:

txtImporte1.Text = "67,62"
txtImporte2.Text = "65,32"
txtImporte3.Text = "2,30"
If cdbl(txtImporte1.Text) <> cdbl(txtImporte2.Text) +
cdbl(txtImporte3.Text) then
'La ejecución pasa por aquí, por la suma de la parte derecha da


como
resultado 67.61999999,
' en lugar de dar 67.62 como debería ser
' Pero tanto cdbl(txtImporte2.Text) como cdbl(txtImporte3.Text)


dan
un resultado correcto por
' separado. Es al sumarlos cuando ocurre el problema

end if

¿Hay algun problema con la funcion Cdbl()? ¿Debo usar otra? ¿Que es
lo
que pasa?




Efectivamente, hay un problema con CDbl. Esa función devuelve un
double, que no es una representación decimal exacta, sino que convierte a
binario el valor decimal y puede perder precisión en los redondeos, cuando
usas un valor decimal que tiene "infinitos" decimales en base dos.

Te sugiero que en lugar de convertir al tipo Double utilices el tipo
Decimal, que sí que usa una representación exacta de los valores
decimales:
If Decimal.Parse(txtImporte1.Text) <> Decimal.Parse(txtImporte2.Text) +
Decimal.Parse(txtImporte3.Text) then ...



Respuesta Responder a este mensaje
#3 A.Poblacion
20/04/2005 - 22:53 | Informe spam
"Baldor" wrote in message
news:%
Gracias por la explicación.

¿Que tal si uso CDec en lugar de Cdbl?



Me imagino que también funcionará. A mi me gusta más usar la sintaxis
"moderna" de .Net (Decimal.Parse), en lugar de la sintaxis antigua heredada
del VB6 (CDec), pero supongo que en cuanto a funcionamiento debe dar lo
mismo.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida