python - tutorial - ¿Por qué float() corta los ceros finales?
todo sobre elasticsearch (3)
El código cose con éxito un gran archivo de muchos números en varios archivos de texto más pequeños con número, pero produce una peculiaridad interesante.
Todos los números deben tener cuatro decimales, como 2.7400, pero en su lugar se imprimen como 2.74.
Aquí hay un fragmento de un archivo
0.96
0.53
0.70
0.53
0.88
0.97
¿Por qué pasó esto? ¿Hay alguna manera de solucionar esto o solo una peculiaridad de float ()?
from itertools import islice
def number_difference(iterable):
return float(iterable[-1].strip(''/n'')) - float(iterable[0].strip(''/n''))
def file_crop(big_fname, chunk_fname, no_lines):
with open(big_fname, ''r'') as big_file:
big_file.readline()
ifile = 0
while True:
data = list(islice(big_file, no_lines))
if not data:
break
with open(''{}_{}.locs''.format(chunk_fname, ifile), ''w'') as small_file:
offset = int(float(data[0].strip(''/n'')))
map(lambda x: str(float(x.strip(''/n'')) - offset) + ''/n'', data)
small_file.write(''{} {} L/n''.format(len(data), number_difference(data)))
small_file.write(''''.join(map(lambda x: str(round((float(x.strip(''/n'')) - offset),4)) + ''/n'', data)))
ifile += 1
Los números de coma flotante IEEE 754 (de los cuales float
es binary64 ) no están diseñados para contener información de precisión. Si necesita hacerlo, debería usar decimal.Decimal
en decimal.Decimal
lugar.
>>> decimal.Decimal(''0.70'')
Decimal(''0.70'')
>>> print decimal.Decimal(''0.70'')
0.70
Vea la documentación decimal
para más detalles.
Puede mantener los ceros formateando la salida:
por ejemplo: si el resultado es 0.96,
x= 0.96
"{0:.4f}".format(x)
Salida:
''0.9600''
La salida será una cadena, aunque ..
El siguiente artículo podría ser una buena lectura: https://docs.python.org/2/tutorial/floatingpoint.html
Explica por qué Python muestra flotadores en el formato anterior.
Un número de coma flotante es simplemente una aproximación en python (y otro lenguaje de programación) ... por ejemplo, un decimal se calcula como un valor binario. Es difícil encontrar los valores exactos para la mayoría de las operaciones de base 10
Después de revisar detenidamente este enlace, verá por qué Python no proporciona los valores exactos para sus operaciones convertidas en base 2
https://docs.python.org/2/tutorial/floatingpoint.html
usar la impresión también puede hacer el trabajo
print("%.4f" % 0.96) or
whatever_file.write("%.4f" % 0.96)