Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus-es / 2011-07

Manejo de decimales

3 messages · 3 people ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Francisco Javier Solis Palma

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

procedure TModuloDatosFrm.frReport1UserFunction(const AName: String; p1, p2,
   p3: Variant; var Val: Variant);
var
   sdato: double;
   Entero: Double;
   Fraccion: Double;
begin
   If AName = 'FORMATO' Then
   Begin
     sdato:=frParser.Calc(P1);
     if sdato = 10 then
     Begin
        sdato := Int(sdato);
        Val:=Format('%n', [sdato]);
     End
     else
     Begin
       Entero := Int(sdato);
       Val:=format('%n', [Entero]);
       Fraccion := Frac(sdato);
       If Fraccion  0 Then
         Val := Val + Format('%d', [Fraccion])
       Else
         Val := Val + Format('%.1d', [Fraccion]);
     end;
   end;
end;

me da un erro que comenta que no se puede pasar el format index, como debo dejar el formato en lazreport, al compilarlo no me da error solo ala ejecutarlo no entiendo por que me da este error si alguien me puede ayudar, de antemano gracias

Reply by email

José Mejuto
to Francisco Javier Solis Palma

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�

Reply by email

Jesus Reyes
to Francisco Javier Solis Palma: Hola a toda la comunidad, tengo un problema, de acuerdo a una serie de par�metros tengo…

--- El mar 5-jul-11, Francisco Javier Solis Palma <fsolispa en gmail.com> escribi�:

si el valor es igual a diez (10), no debe de tener valor decimal pero si es menor a este n�mero debe de mostrarse los decimales incluso el cero esto es si la cantidad es nueve (9) debe mostrarse 9.0,

....

Show quoted text 19 lines
� � Begin � � � Entero := Int(sdato); � � � Val:=format('%n', [Entero]); � � � Fraccion := Frac(sdato); � � � If Fraccion 0 Then � � � � Val := Val + Format('%d', [Fraccion]) � � � Else � � � � Val := Val + Format('%.1d', [Fraccion]); � � end; � end; end; me da un erro que comenta que no se puede pasar el format index, como debo dejar el formato en lazreport, al compilarlo no me da error solo ala ejecutarlo no entiendo por que me da este error si alguien me puede ayudar, de antemano gracias

Supongo que el error te lo da en las lineas Format citadas, el formato "%d" esta restringido a n�meros enteros, pero "Fraccion" es double,

Ademas si entend� bien, para 10 lo debe mostrar sin decimal, menor que 10 con decimal (y mayor que 10?),  usando la t�cnica que te coment� Jos� una vez que sabes que es 10 simplemente regresa: val := '10' no es necesario convertir, para los otros n�meros es mas f�cil usar una funcion especifica para formatear n�meros: val := FormatFloat('0.0',sDato), esto te asegura que cualquier otro n�mero ser� formateado con un decimal, si necesitas mas decimales simplemente usa val := FormatFloat('0.00',sDato); etc. Para mas opciones de formatfloat ve http://www.freepascal.org/docs-html/rtl/sysutils/formatfloat.html

Jesus Reyes A.

Reply by email