Convert decimal number to rational: Difference between revisions

From Rosetta Code
Content added Content deleted
No edit summary
(→‎{{header|BASIC}}: Add Python)
Line 253: Line 253:


end</lang>
end</lang>

=={{header|Python}}==
Note that the decimal values of the task description are truncated in some cases.

The first loop limits the size of the denominator the second uses the Decimal module to convert an accurate Decimal representation of the given values to a fraction.
<lang python>>>> from fractions import Fraction
>>> for d in (0.9054054, 0.518518, 0.75): print(d, Fraction(d).limit_denominator(100))

0.9054054 67/74
0.518518 14/27
0.75 3/4
>>> from decimal import Decimal
>>> for d in '0.9054054 0.518518 0.75'.split(): print(d, Fraction(Decimal(d)))

0.9054054 4527027/5000000
0.518518 259259/500000
0.75 3/4
>>> </lang>

Revision as of 05:42, 12 June 2011

Convert decimal number to rational is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

Program to convert a decimal number to fraction.

For transform a decimal to a fraction, previously we have to know what type is the decimal number, here are some examples

'Examples of types decimal numbers:

67 / 74 = 0.9054054 >>> Mixed decimal number

42 / 81 = 0.518518 >>> Pure decimal number

3/4 = 0.75 >>> Exact decimal number

Task Description
  1. Write a function/routine/method/... that transform a decimal number to fraction.

BASIC

<lang qbasic> 'Program to transform a decimal to a fraction 'LRCVS 11.06.11

declare sub exacto (a$) declare sub puro (a$, b$()) declare sub mixto (a$, b$()) declare sub multiplo (a$)

dim as integer l, r, s, t, k, w1, i, m, x, ll, pp, ps, u, v, j

dim as string a, c, d

dim y () as string dim w2 () as string

cls input "Decimal number = ";a$ print if instr(a$,".") = 0 then print "This is not a decimal number " : goto 100 cls l = len(a$)

for r = 1 to l for s = 1 to l if s + r = l + 2 then exit for k = k + 1 next s next r

w1 = k redim y$(w1) redim b$(w1)

k = 0 for r = 1 to l for s = 1 to l c$ = mid$(a$,r,s) if s + r = l + 2 then exit for if len(c$) <= int(l/2) then k = k + 1 : y$(k) = c$ next s next r t = 0

for r = 1 to k i = 0 f = 0 x = 0 m = 0 if i = 0 then i = instr(a$,y$(r)):x = 1 for s = 1 to len(a$) if x = 1 then f = instr(s,a$,y$(r)) if x = 1 and f > m then m = f next s

h = 0 k = 0 for n = i to m step len(y$(r)) if h = 0 and mid$(a$,n,len(y$(r))) = y$(r) then k = k + 1 else h = 1 next n if k > 1 then t = t + 1 :b$(t) = y$(r) next r

for r = 1 to w1 for s = r + 1 to w1 if b$(r) = b$(s) then b$(s) = "" next s next r

print "Decimal number = ";a$ print 'if b$(1) <> "" then print "repeticion = ";b$(1) 'print ll = len(a$) pp = instr(a$,".") d$ = mid$(a$,pp+1,ll) ps = instr(d$,b$(1)) if ps = 0 then

               print "Exact decimal number "
               print
               call exacto (a$)
               end if

if ps = 1 then

               print "Pure decimal number "
               print
               call puro (a$, b$())
               end if

if ps > 1 then

                print "Mixed decimal number "
                print
                call mixto (a$, b$())
                end if

100: print print "End" sleep end

sub exacto (a$) dim as integer b, c, d, g, may, j, k, l, r, s, u, v, w, f dim as string z, h, g1 b = len(a$) c = instr(a$,".") d = b - c z$ = "0" g = int(val(a$)) h$ = right$(a$, b - c)

may = 0 j = 10^d k = val(h$) for n = 9 to 1 if j mod (1*(10^n)) = 0 and k mod (1*(10^n)) = 0 then j = j/(1*(10^n)) : k = k/(1*(10^n)) : exit for next n l = 1 if j > k then may = j else may = k for n = 1 to may r = (j mod n) s = (k mod n) if r = 0 and s = 0 then l = n next n u = k/l v = j/l w = (g * v) + u print w;"/";v ;" = " ;w/v end sub

sub puro (a as string, b() as string) dim as integer b2, c, d, g, may, j, k, l, r, s, u, v, w, f, lr dim as string z, h, g1, x 'decimal puro z$ = b$(1) lr = len (z$) b2 = len (a$) c = instr (a$,".") g = int (val(a$)) b2 = len(z$) + 1 + len(str$(g)) a$ = str$(g) + "." + z$ h$ = right$(a$, b2 - c)

may = 0 x$ = "" for n = 1 to lr x$ = x$ + "9" next n

j = val(x$) k = val(h$) l = 1 for n = 9 to 1 if j mod (1*(10^n)) = 0 and k mod (1*(10^n)) = 0 then j = j/(1*(10^n)) : k = k/(1*(10^n)) : exit for next n if j > k then may = j else may = k for n = 1 to may

  r = (j mod n)
  s = (k mod n)
  if r = 0 and s = 0  then l = n

next n u = k/l v = j/l w = (g * v) + u print w;"/";v ;" = ";w/v end sub

sub mixto (a as string, b() as string)

dim as integer b3, c, d, g, may, j, k, l, r, s, u, v, w, f, lr, lz, ly, x5 dim as string z, h, g4, g7, x, y

z$ = b$(1) x5 = int(val(a$)) w = instr(a$, z$) v = instr(a$,".") y$ = mid$(a$,v+1,w-v-1) lz = len(z$) ly = len(y$) b3 = (val(y$)*(9*(10^ly))) + ((1*(10^ly))* (val(z$))) c = (9*(10^ly))*(1*(10^ly))

may = 0 j = b3 k = c for n = 9 to 1 if j mod (1*(10^n)) = 0 and k mod (1*(10^n)) = 0 then j = j/(1*(10^n)) : k = k/(1*(10^n)) : exit for next n if j > k then may = j else may = k for n = 1 to may

  r = (j mod n)
  s = (k mod n)
  if r = 0 and s = 0  then l = n

next n u = k/l v = j/l if x5 <> 0 then print (x5*v)+ u;"/";u ;" = ";((x5*v)+ u)/u else print v;"/";u;" = "; v/u f = len(a$) j = 0 if x5 <> 0 then g7$ = str$(((x5*v)+u)/u) else g7$ = str$(v/u)

if mid$(a$,1,f) <> mid$(g7$,1,f) then print ">>> error !!!" :j = 1

if j = 1 then call multiplo (a$)

end sub

sub multiplo (a$) dim as integer j, b, c, g, h, k, n, u, v dim as string e,f cls print "Numero decimal exacto" print j = 0 b = len(a$) c = instr(a$,".") d = b - c e$ = str$(int(val(a$))) f$ = mid$(a$,c + 1 , d) g = val(e$+f$) h = 1*(10^d) may = 0 'limite j = g k = h if j > k then may = j else may = k for n = 9 to 1 if j mod (1*(10^n)) = 0 and k mod (1*(10^n)) = 0 then j = j/(1*(10^n)) : k = k/(1*(10^n)) : exit for next n for n = 1 to j * k if j mod n = 0 and k mod n = 0 then l = n :exit for next n u = k/l 'numerador v = j/l 'denominador print v;"/";u ;" = "; v / u end sub

end</lang>

Python

Note that the decimal values of the task description are truncated in some cases.

The first loop limits the size of the denominator the second uses the Decimal module to convert an accurate Decimal representation of the given values to a fraction. <lang python>>>> from fractions import Fraction >>> for d in (0.9054054, 0.518518, 0.75): print(d, Fraction(d).limit_denominator(100))

0.9054054 67/74 0.518518 14/27 0.75 3/4 >>> from decimal import Decimal >>> for d in '0.9054054 0.518518 0.75'.split(): print(d, Fraction(Decimal(d)))

0.9054054 4527027/5000000 0.518518 259259/500000 0.75 3/4 >>> </lang>