Here is an implementation of the continued fractions to get the fractions at an accepted accuracy.
DecNum = the number to convert to fraction
accuracy = how many decimals after point to compare
fractype = zero for only fractions or anything other that zero whole number & fractions ie: 13.25 = 53/4 = 13 1/4
'
Code:
#COMPILE EXE ' PBWIN 10, PBCC 6 #DIM ALL #UNIQUE VAR ON %Unicode = 1 FUNCTION Decimal2Fraction(DecNum AS EXT, Accuracy AS LONG, fractype AS LONG) AS WSTRING ' It uses the concept of continued fractions to calculate an approximated fraction ' DecNum = the number to convert to fraction ' accuracy = how many decimals after point to compare --- I find 4 good for my needs (like construction) ' fractype = only fractions or whole number & fractions ie: 13.25 = 53/4 = 13 1/4 LOCAL z AS EXT LOCAL fraDen AS EXT LOCAL fraNum AS EXT LOCAL preDen AS EXT LOCAL counter AS LONG LOCAL temp AS EXT IF FRAC(DecNum) = 0 THEN FUNCTION = FORMAT$(DecNum) : EXIT FUNCTION ' it's a whole number, no decimal ' Initialize some values z = DecNum preDen = 0 fraDen = 1 counter = 0 'just to prevent endless loop DO z = (1 / (z - INT(z))) temp = fraDen fraDen = INT(z) * fraDen + preDen preDen = temp fraNum = INT(DecNum * fraDen + 0.5) counter = counter + 1 LOOP UNTIL (ABS((DecNum - (fraNum / fraDen))) < 10^-(Accuracy)) OR (z = INT(z)) OR (counter = 500) IF Fractype = 0 OR FIX(fraNum/fraDen) = 0 THEN ' 0 --> fraction only 13.25 = 53/4 FUNCTION = FORMAT$(fraNum) & "/" & FORMAT$(fraDen) ELSE ' not zero --> whole number & fraction 13.25 = 13 1/4 IF ABS(fraNum - FIX(fraNum/fraDen)*fraDen) = 0 THEN FUNCTION = FORMAT$(FIX(fraNum/fraDen)) ELSE FUNCTION = FORMAT$(FIX(fraNum/fraDen)) + " " + FORMAT$(ABS(fraNum - FIX(fraNum/fraDen)*fraDen))+ "/" + FORMAT$(fraDen) END IF END IF END FUNCTION '----------------------- Demo the function FUNCTION PBMAIN () AS LONG LOCAL sBuffer AS STRING LOCAL lCount AS LONG LOCAL DecNum() AS EXT DIM DecNum(14) ARRAY ASSIGN DecNum() = 5.015625##, 6.03125##, -13.0625##, 534.75##, 13.4##, -2.5##, 0.1111111##, 0.125##, 0.1428571##, 0.1667##, 0.200##, 0.25##, 0.33333##, 0.5##, 0.999999## '13 2/5 -2 1/2 1/9 1/8 1/7 1/6 1/5 1/4 1/3 1/2 1 FOR lCount = 0 TO 14 sBuffer += FORMAT$(DecNum(lCount)) + $TAB+ $TAB+ Decimal2Fraction(DecNum(lCount), 4, 0) _ + $TAB+ $TAB + Decimal2Fraction(DecNum(lCount), 4, 1) + $LF NEXT #IF %DEF(%PB_CC32) ' Deal with PBCC not printing stringvars with $LF and $tab correctly LOCAL lLoop AS LONG LOCAL sTemp2 AS WSTRING lCount = PARSECOUNT(sBuffer, $LF) FOR lLoop = 1 TO lCount sTemp2 = PARSE$(sBuffer,$LF,lLoop) COLOR 7: ? PARSE$(sTemp2, $TAB+$TAB, 1), : COLOR 2: ? PARSE$(sTemp2, $TAB+$TAB, 2), : COLOR 3: ? PARSE$(sTemp2, $TAB+$TAB, 3) NEXT lCount WAITKEY$ #ELSE ' PBWin ? sBuffer #ENDIF END FUNCTION '