PDA

Ver la Versión Completa : Error Incomprensible


altp
23-11-2006, 17:37:40
Buenas tardes foreros.

No se si esta pregunta va bien akí

Les cuento mi problema

Tengo una tabla en Memoria (TRxMemoryData) con varios campos, en concreto 2 de ellos son Debe y Haber (son de tipo TIBBCDField), el caso es que hago lo siguiente:


var
Importe : Extended;
begin
Importe := 0;
while not Rx.Eof do begin
Importe := Importe + Rx.FieldByName('Debe').AsFloat - Rx.FieldByName('Haber').AsFloat;
Rx.Next;
end;
end;


Tengo ese código, para el ejemplo que les pongo el while lo recorre 3 veces:
1ª vuelta --> Debe = 553,11 --> Haber = 0 --> Importe = 553,11
2ª vuelta --> Debe = 0 --> Haber = 36,19 --> Importe = 516,92
3ª vuelta --> Debe = 0 --> Haber = 516,92 --> Importe = 5,6843418861e-14

A qué se debe que no me salga 0?

Les agradecería cualquier ayuda.

Gracias

roman
23-11-2006, 17:50:30
¡Hombre! 5,6843418861e-14 es muuuuy cercano a cero, ¿qué no? Seguramente nadie se preocupará por esas diferencias monetarias.

Pero bueno, lo que pasa es que los float no son precisos debido a la representación interna (binaria) en la computadora. En muchas situaciones, el nivel de precisión es tan alto que las diferencias son despreciables. No obstante, me parece que para cuestiones monetarias es mejor usar el tipo Currency (*).

(*) Lo cual no deja de ser curioso: podemos vivir con errar en 0.00000001 metros el punto de aterrizaje de una nave espacial, pero desde luego no nos perdonarán 0.00000001 céntimos que debamos. :)

// Saludos

altp
23-11-2006, 17:52:41
Muchas gracias Roman.

Voy a probarlo y te cuento.

altp
23-11-2006, 17:57:08
Me ha funcionado correctamente.

Me aconsejas que las variables las declare de tipo Currency en vez de Extended-Real - etc?

El tipo Currency va bien con el tema de los decimales?
Te lo pregunto porque ese pedazo de código anterior es para una contabilidad.

Gracias, espero tu respuesta.

roman
23-11-2006, 18:18:00
El tipo Currency va bien con el tema de los decimales?

Mira, yo realmente no manejo esos temas así que desconfía siempre de lo que yo diga :), pero yo diría que van perfectamente con los decimales porque están pensados precisamente para ello, es decir, para manejar operaciones monetarias:


Currencyis a fixed-point data type that minimizes rounding errors in monetary calculations. It is stored as a scaled 64-bit integer with the four least significant digits implicitly representing decimal places. When mixed with other real types in assignments and expressions, Currency values are automatically divided or multiplied by 10000.


// Saludos

altp
23-11-2006, 18:23:49
Gracias Roman.

Doy por concluído el Hilo.