130 FOR X = 1 TO 7: READ V:DN = V: GOSUB 260: PRINT TAB( 2);V;: PRINT TAB( 24);DF$: NEXT X: PRINT
140 FOR X = 1 TO 7: READ V$:DF$ = V$: GOSUB 440: PRINT TAB( 2);V$;: PRINT TAB( 24);DN: NEXT X
150 END
160 DATA 3.33,5.15,3.77,1.02,35.6,23.88,11.05
170 DATA "25 1/2","3 4/5","2/3","25/4","5 5/4","11 1/5","135/5"
180 REM
190 REM **********************
200 REM * CONVERT ROUTINES *
210 REM * START HERE *
220 REM **********************
230 REM
240 REM DECIMAL TO FRACTION
250 REM
260 DF$ = "0": ON ((DN <.005) AND (DN > -.005)) GOTO 400:DN$ = STR$(DN):L = LEN(DN$): FOR INDX = 1 TO L: ON ( MID$ (DN$,INDX,1) = ".") GOTO 280: NEXT INDX: REM INITIALIZE VARIABLES, CONVERT NUMBER INTO A STRING, AND LOCATE DECIMAL POINT
270 DF$ = DN$: RETURN : REM IF NO DECIMAL POINT, EXIT ROUTINE
280 IF INDX = 1 THEN DN$ = "0" +DN$:INDX = INDX +1: REM IF NUMBER < 1, THEN ADD A ZERO TO THE STRING
290 W$ = LEFT$(DN$,INDX -1) +" ":DEC$ = MID$ (DN$,INDX,10): IF VAL(W$) = 0 THEN W$ = "": REM FIND WHOLE AND DECIMAL PORTIONS OF NUMBER
300 DEC = VAL(DEC$):DEC = (100 *( INT((DEC +.005) *100)/100)): IF DEC <.005 THEN DF$ = W$: RETURN : REM ROUND DECIMAL PORTION TO 2 PLACES; IF THE DECIMAL PORTION IS IS TOO SMALL, EXIT THE ROUTINE
310 NUM = DEC:DEN = 100:PASS = 0: REM INITIALIZE NUMERATOR, DENOMINATOR, AND COUNTER
320 FOR INDX = 10 TO 1 STEP -1: REM INITIATE LOOP TO REDUCE FRACTION TO LOWEST TERMS
330 IF (NUM/INDX = INT(NUM/INDX)) AND (DEN/INDX = INT(DEN/INDX)) THEN NUM = (NUM/INDX):DEN = (DEN/INDX): REM REDUCE THE FRACTION
340 NEXT INDX:PASS = PASS +1: IF PASS <2 THEN GOTO 320: REM FINISH LOOP AND REPEAT IT TWICE TO MAKE SURE FRACTION IS IN LOWEST TERMS
350 NUM$ = STR$(NUM):DEN$ = STR$(DEN): REM CONVERT NUMERATOR AND DENOMINATOR TO STRINGS
360 IF (NUM$ = "2" AND DEN$ = "100") THEN NUM$ = "1":DEN$ = "50": REM CHECK FOR FRACTIONS THAT AREN'T COMPLETELY REDUCED - LINES 360,370,380
370 IF (NUM$ = "4" AND DEN$ = "100") THEN NUM$ = "1":DEN$ = "25"
380 IF (NUM$ = "8" AND DEN$ = "100") THEN NUM$ = "2":DEN$ = "25"
400 IF (DN <0 AND LEFT$(DF$,1) < >"-" AND DF$ < >"0") THEN DF$ = "-" +DF$: RETURN
410 RETURN
420 REM FRACTION TO DECIMAL
430 REM
440 W$ = "":DN = 0:DP = 0:L = LEN(DF$): FOR INDX = 1 TO L: ON ( MID$ (DF$,INDX,1) = "/") GOTO 450: NEXT INDX: GOTO 530: REM INITIALIZE VARIABLES AND FIND FRACTIONAL PORTION; IF THERE ISN'T A FRACTION, SKIP DOWN TO 530
450 FOR INDX = 1 TO LEN(DF$): IF MID$ (DF$,INDX,1) = " " THEN W$ = LEFT$(DF$,INDX):F$ = MID$ (DF$,INDX +1,10): GOTO 470: REM TRY TO SPLIT STRING INTO WHOLE AND FRACTIONAL PORTIONS
460 NEXT INDX:F$ = DF$: REM ACCOUNT FOR A FRACTION WITH NO WHOLE PORTION
470 L = LEN(F$): FOR INDX = 1 TO L: IF MID$ (F$,INDX,1) = "/" THEN ON (INDX < = 1) GOTO 530:NUM$ = LEFT$(F$,INDX -1):DEN$ = MID$ (F$,INDX +1): GOTO 480: REM SPLIT FRACTION INTO NUMERATOR AND DENOMINATOR
480 NEXT INDX
490 NUM = VAL(NUM$):DEN = VAL(DEN$): IF NUM = 0 OR DEN = 0 THEN 530: REM CONVERT NUMERATOR AND DENOMINATOR STRINGS INTO VALUES
500 DP = NUM/DEN:DP = ( INT((DP +.005) *100)/100): REM COMPUTE AND ROUND DECIMAL PORTION
510 DN = ABS( VAL(W$)) +DP: IF LEFT$(DF$,1) = "-" THEN DN = ( -DN): IF LEFT$(DF$,1) = "-" AND DN >0 THEN DN = -DN: REM BUILD DECIMAL NUMBER AND CHECK IF LESS THAN 0
520 RETURN : REM EXIT ROUTINE
530 L = LEN(DF$): FOR INDX = 1 TO L: ON MID$ (DF$,INDX,1) = " " GOTO 540: NEXT INDX: REM IF NO FRACTION, TRY TO FIND THE WHOLE PORTION OF NUMBER
540 DN = VAL( LEFT$(DF$,INDX)): RETURN : REM CONVERT WHOLE PORTION INTO A VALUE AND EXIT ROUTINE