Cómo representar más de la cantidad predeterminada de dígitos en números como (1/7) en Python

Para cualquiera que tenga curiosidad sobre cómo podría hacer esto sin bibliotecas, puede usar la división larga tal como lo aprendió en la escuela primaria. Primero tengo que definir algunas funciones auxiliares comunes, pero el trabajo real lo realiza long_division.

def take(sequence, n):
"take the first n elements of sequence"
for i, elem in enumerate(sequence):
if i == n: break
yield elem def concatenate(sequence, sep=""):
"convert elements of sequence to string and join by sep"
return sep.join(map(str, sequence)) def qr(num, denom):
"quotient, remainder"
return num // denom, num % denom def long_division(num, denom):
"generates integer portion followed by decimal digits of num/denom"
digit, num = qr(num, denom)
yield digit
while True:
num *= 10
digit, num = qr(num, denom)
yield digit def n_places(num, denom, n):
"return num/denom to n decimal places"
gen = long_division(num, denom)
integer = next(gen)
decimal = concatenate(take(gen, n))
return "{}.{}".format(integer, decimal) print(n_places(1, 7, 50))
# 0.14285714285714285714285714285714285714285714285714

def take(sequence, n):
"take the first n elements of sequence"
for i, elem in enumerate(sequence):
if i == n: break
yield elem def concatenate(sequence, sep=""):
"convert elements of sequence to string and join by sep"
return sep.join(map(str, sequence)) def qr(num, denom):
"quotient, remainder"
return num // denom, num % denom def long_division(num, denom):
"generates integer portion followed by decimal digits of num/denom"
digit, num = qr(num, denom)
yield digit
while True:
num *= 10
digit, num = qr(num, denom)
yield digit def n_places(num, denom, n):
"return num/denom to n decimal places"
gen = long_division(num, denom)
integer = next(gen)
decimal = concatenate(take(gen, n))
return "{}.{}".format(integer, decimal) print(n_places(1, 7, 50))
# 0.14285714285714285714285714285714285714285714285714

def take(sequence, n):
"take the first n elements of sequence"
for i, elem in enumerate(sequence):
if i == n: break
yield elem def concatenate(sequence, sep=""):
"convert elements of sequence to string and join by sep"
return sep.join(map(str, sequence)) def qr(num, denom):
"quotient, remainder"
return num // denom, num % denom def long_division(num, denom):
"generates integer portion followed by decimal digits of num/denom"
digit, num = qr(num, denom)
yield digit
while True:
num *= 10
digit, num = qr(num, denom)
yield digit def n_places(num, denom, n):
"return num/denom to n decimal places"
gen = long_division(num, denom)
integer = next(gen)
decimal = concatenate(take(gen, n))
return "{}.{}".format(integer, decimal) print(n_places(1, 7, 50))
# 0.14285714285714285714285714285714285714285714285714

def take(sequence, n):
"take the first n elements of sequence"
for i, elem in enumerate(sequence):
if i == n: break
yield elem def concatenate(sequence, sep=""):
"convert elements of sequence to string and join by sep"
return sep.join(map(str, sequence)) def qr(num, denom):
"quotient, remainder"
return num // denom, num % denom def long_division(num, denom):
"generates integer portion followed by decimal digits of num/denom"
digit, num = qr(num, denom)
yield digit
while True:
num *= 10
digit, num = qr(num, denom)
yield digit def n_places(num, denom, n):
"return num/denom to n decimal places"
gen = long_division(num, denom)
integer = next(gen)
decimal = concatenate(take(gen, n))
return "{}.{}".format(integer, decimal) print(n_places(1, 7, 50))
# 0.14285714285714285714285714285714285714285714285714

def take(sequence, n):
"take the first n elements of sequence"
for i, elem in enumerate(sequence):
if i == n: break
yield elem def concatenate(sequence, sep=""):
"convert elements of sequence to string and join by sep"
return sep.join(map(str, sequence)) def qr(num, denom):
"quotient, remainder"
return num // denom, num % denom def long_division(num, denom):
"generates integer portion followed by decimal digits of num/denom"
digit, num = qr(num, denom)
yield digit
while True:
num *= 10
digit, num = qr(num, denom)
yield digit def n_places(num, denom, n):
"return num/denom to n decimal places"
gen = long_division(num, denom)
integer = next(gen)
decimal = concatenate(take(gen, n))
return "{}.{}".format(integer, decimal) print(n_places(1, 7, 50))
# 0.14285714285714285714285714285714285714285714285714

def take(sequence, n):
"take the first n elements of sequence"
for i, elem in enumerate(sequence):
if i == n: break
yield elem def concatenate(sequence, sep=""):
"convert elements of sequence to string and join by sep"
return sep.join(map(str, sequence)) def qr(num, denom):
"quotient, remainder"
return num // denom, num % denom def long_division(num, denom):
"generates integer portion followed by decimal digits of num/denom"
digit, num = qr(num, denom)
yield digit
while True:
num *= 10
digit, num = qr(num, denom)
yield digit def n_places(num, denom, n):
"return num/denom to n decimal places"
gen = long_division(num, denom)
integer = next(gen)
decimal = concatenate(take(gen, n))
return "{}.{}".format(integer, decimal) print(n_places(1, 7, 50))
# 0.14285714285714285714285714285714285714285714285714

El paquete decimal puede obtener precisión arbitraria.

9.4. decimal – Aritmética decimal de punto fijo y coma flotante – Documentación de Python 2.7.9rc1

Si habla de representación de cadena, puede usar el formato de cadena:

imprimir “%. * f”% (30, 1 / 7.0)