Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Error Incomprensible (https://www.clubdelphi.com/foros/showthread.php?t=37824)

altp 23-11-2006 17:37:40

Error Incomprensible
 
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:

Código Delphi [-]
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

Cita:

Empezado por altp
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:

Cita:

Empezado por ayuda de Delphi
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.


La franja horaria es GMT +2. Ahora son las 06:46:01.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi