Archive
Decimal expansion of the digits of a fraction
Problem
If you want to expand the digits of a fraction to arbitrary precision (for instance “find 100 digits of the fraction 1/7“), floating point division won’t work since its precision is limited:
>>> 1/7.0 0.14285714285714285
This problem is related to Problem 26 in Project Euler.
Solution
Let’s see the fraction 1/7. 1 divided by 7 is 0, the remainder is 1. Now repeat the following steps: multiply the remainder (here 1) by 10 and divide it by 7 (result: 1), the remainder is 3. Multiply 3 by 10 and divide by 7, etc. See the process in the following table:
(1 * 10) / 7 = 1 * 7 + 3 (3 * 10) / 7 = 4 * 7 + 2 (2 * 10) / 7 = 2 * 7 + 6 (6 * 10) / 7 = 8 * 7 + 4 (4 * 10) / 7 = 5 * 7 + 5 (5 * 10) / 7 = 7 * 7 + 1 (1 * 10) / 7 = 1 * 7 + 3 (3 * 10) / 7 = 4 * 7 + 2
The numbers in bold are exactly the first few digits of 1/7 = 0.14285714…
Python code #1
Here is the implementation of this method:
#!/usr/bin/env python
PRECISION = 100
SHOW_ZEROS = False
def decimal_expansion(a, b):
q = a/b
r = a%b
s1 = str(q)
l2 = []
for i in range(PRECISION):
a = r * 10
q = a/b
r = a%b
l2.append(q)
if r == 0 and not SHOW_ZEROS:
break
s2 = ''.join([str(x) for x in l2])
return s1, s2
def main():
a = 1
b = 7
s1, s2 = decimal_expansion(a, b)
print "{0}.{1}".format(s1, s2)
if __name__ == "__main__":
main()
Python code #2
There is an easier way: the standard library contains a module called “decimal” that provides support for decimal floating point arithmetic.
#!/usr/bin/env python
from decimal import getcontext, Decimal
PRECISION = 100
def main():
a = 1
b = 7
getcontext().prec = PRECISION
result = Decimal(a) / Decimal(b)
s = str(result)
print s
if __name__ == "__main__":
main()
Credits
I’ve read about this decimal expansion method in this post.
