Ver Mensaje Individual
  #7  
Antiguo 27-05-2006
Avatar de lpmlpm
lpmlpm lpmlpm is offline
Miembro
 
Registrado: ago 2005
Posts: 136
Reputación: 19
lpmlpm Va por buen camino
Ok. a ver ahora un poco más digerido:

Código Delphi [-]

uses Math;

function RealaFraccion(R: string): string;
var a, b, mcd, mcm, tmp, resto, NDecimales: INTEGER;
begin
  if StrToFloatDef(R, 0) = 0 then
  begin
    Result := '0';
    Exit;
  end;
  NDecimales := Length(R) - Pos('.', R);
  a := Trunc(StrToFloat(R) * Power(10, NDecimales));
  b := Trunc(Power(10, NDecimales));
  tmp := a;
  mcd := b;
  repeat
    resto := tmp mod mcd;
    if resto <> 0
      then begin
      tmp := mcd;
      mcd := resto;
    end;
  until resto = 0;
  Result := IntToStr(A div mcd) + '/' + IntToStr(B div mcd);
end;

//Y lo llamarías así:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption := RealaFraccion(Edit1.Text)
end;

Seguro que pudiera optimizarse en varias partes... es una versión preliminar y he sido un poco cobarde al no querer involucrarme demasiado con los diferentes tipos de datos flotantes que hay pero en mi experiencia trabajar de este modo te da mucha tranquilidad y es mejor llevarla tranquila por ese lado... prefiero tratar los flotantes limitados como estos como cadenas para evitar conflictos y respetar al máximo el número real que tu quieres convertir en fracción...

Saludos
__________________
"Lo mejor de no saber hacer nada es que se tiene mucho tiempo libre."
Responder Con Cita