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?
 

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 ...

Preguntas similares