2012-06-20 8 views
7

Como dice la pregunta. La conversión a/desde las representaciones de cadena (truncadas) puede afectar su precisión. Pero almacenarlos en otros formatos como pickle los hace ilegibles (sí, también quiero esto).¿Cómo almacenar un número de punto flotante como texto sin perder precisión?

¿Cómo puedo almacenar números de coma flotante en texto sin perder precisión?

+0

¿Ha probado las conversiones de cadenas para asegurarse de que la conversión sea un problema para usted? –

+0

¿Qué precisión estás buscando? –

+0

Para la legibilidad sin pérdida de información, 'repr' es, con mucho, la mejor opción. Está garantizado por el lenguaje que 'float (repr (x))' recupera 'x' sin pérdida de información. –

Respuesta

3

Sugeriría utilizar la función integrada repr(). A partir de la documentación:

repr (objeto) -> string

Muestra el código canónico del objeto. Para la mayoría de los tipos de objetos, eval (repr (object)) == object.

+2

El problema es el "más". 'flotar' no siempre cae bajo eso. –

+1

@Ignacio Vazquez-Abrams, por curiosidad, ¿puedes dar ejemplos para eso? – silvado

+0

Por desgracia, desafortunadamente. –

-1

pickle.dumps lo hará, pero yo creo float(str(floatval)) == floatval también - al menos en el mismo sistema ...

+0

No; en Python <= 2.7 y Python 3.1, 'str()' de un float perderá precisión (aunque para Python 3.2 y posterior, no lo hace). Desea usar 'repr' en su lugar. –

7

tienda en binario o una eficacia de ella.

>>> (3.4).hex() 
'0x1.b333333333333p+1' 

>>> float.fromhex('0x1.b333333333333p+1') 
3.4 
+0

importante sería si el resultado de esto es igual al inicio, entonces algo así como 'check = lambda a: float.fromhex (a.hex()) == a' y con esto, prueba varios valores. Pero en general, su enfoque es muy bueno. – glglgl

+0

@glglgl: Esa operación debe ser perfectamente idempotente para cada flotador no infinito, no NaN IEEE 754 de doble precisión. –

+0

@ IgnacioVazquez-Abrams: ¡Y para infinitos, también! (Y NaNs, siempre que no te preocupe la posibilidad de perder bits de signo y/o carga útil, o convertir los NaN de señalización en NaN silenciosos). –

Cuestiones relacionadas