[Lazarus-es] Manejo de decimales

José Mejuto joshyfun en gmail.com
Mar Jul 5 13:49:28 CEST 2011


Hello Francisco,

Tuesday, July 5, 2011, 12:17:16 PM, you wrote:

FJSP> Hola a toda la comunidad, tengo un problema, de acuerdo a una serie de
FJSP> parámetros tengo que poner o no decimales esto es
FJSP> si el valor es igual a diez (10), no debe de tener valor decimal pero si
FJSP> es menor a este número debe de mostrarse los decimales incluso el cero
FJSP> esto es si la cantidad es nueve (9) debe mostrarse 9.0, esto debe de ser
FJSP> pasando un formato a lazreport, realice el siguiente código pero me da error
FJSP>   el código es el siguiente

En tu código tienes varios problemas pero el más importante es creer
que la parte fraccional de un número double puede ser cero. Me
explico, un double usa IEEE para almacenar los datos, la fracción se
calcula por aproximación a 15 decimales o algo así, de modo que este
código:

var
 a,b: double;
begin
 a:=10.0;
 b:=a+1;
 if b=11.00 then "OK".
end;

Rara vez, va a dar "OK". Bueno quizá en el caso de la suma si, pero en
general no podemos asumir eso ya que la precision del decimal no es
perfecta, de modo que cuando hacemos "a:=10.0;" el valor de "a" rara
vez será 10 exacto, normalmente será algo como "10.0000000000002". En
la unit "math" tienes varias funciones para comprobar exactitudes, de
modo que el código de arriba debería ser algo como:

var
 a,b: double;
begin
 a:=10.0;
 b:=a+1;
 if SameValue(b,11.00,0.000001) then "OK".
end;

Eso nos dice que si el valor es 11.000000* lo consideramos 11 exacto.

Suponiendo que necesitas una precisión de 4 decimales que es lo
habitual podrías crear una función como:

function TieneDecimales(const v: double): Boolean;
begin
  if SameValue(v,trunc(v),0.00001) then
    Result:=true
  else
    Result:=false;
end;

No lo he probado, pero algo así debería de funcionarte.

-- 
Best regards,
 José





More information about the Lazarus-es mailing list