` Printed Icetips Article

Icetips Article



Par2: Decimal to Fraction
2004-05-03 -- Michael Ware
 
I'm sure this function could be optimized a bit, but it runs fast enough for me:

RealToFraction       PROCEDURE  (REAL Num)            ! Declare Procedure
i           LONG
HldCheck    LONG
BreakVal    LONG
Numerator   LONG
Denominator LONG
StringValue STRING(50)
  CODE
    StringValue = Num
    i = INSTRING('.',StringValue,1,1)
    IF ~i
        DO ExitProc
    END
    StringValue = SUB(StringValue,i+1,LEN(CLIP(StringValue)))
    BreakVal = LEN(clip(StringValue))
    IF BreakVal > 46  ! error check for string slicing
        BreakVal = 46
    END
! Parse out the Numerator from the decimal
    Numerator = 0
    Denominator = 1
    LOOP i = 1 TO BreakVal
        IF StringValue[( i ):(i+3)] = '0000' THEN BREAK.
        Numerator = 10*Numerator + StringValue[i]
        Denominator = 10*Denominator
    END
    IF ~Numerator
        StringValue = Num
        DO EXITPROC
    END
    LOOP
        HldCheck = Numerator
        BreakVal = 1+SQRT(Denominator)
        LOOP i = 2 TO BreakVal
            IF (Numerator % i) = 0 AND (Denominator % i) = 0
                Numerator = Numerator/i
                Denominator = Denominator/i
                BREAK
            END
        END
        IF HldCheck=Numerator THEN BREAK.
    END
    StringValue = INT(Num) & ' ' & Numerator & '/' & Denominator
    DO ExitProc

ExitProc    ROUTINE
    RETURN (StringValue)



Printed May 7, 2024, 1:50 am
This article has been viewed/printed 35116 times.