TLDR;)

Hubo un problema de redondeo de entrada/salida finalmente arreglado por Python 2.7.0 Y: 3.1:.

Un número redondeado correctamente se puede invertir de un lado a otro.
str -> float() -> repr() -> float() ... o: Decimal -> float -> str -> Decimal
El tipo decimal ya no es necesario para el almacenamiento.


(Por supuesto, puede ser necesario redondear el resultado de sumar o restar números redondeados para eliminar errores en el último bit. La aritmética decimal clara puede ser útil, pero la conversión línea por línea str() (es decir, redondear hasta 12 dígitos válidos) suele ser bastante bueno a menos que se requiera una precisión extrema o un número extremo de operaciones secuenciales).

prueba infinita:

import random
from decimal import Decimal
for x in iter(random.random, None):           # Verify FOREVER that rounding is fixed :-)
    assert float(repr(x)) == x                # Reversible repr() conversion.
    assert float(Decimal(repr(x))) == x
    assert len(repr(round(x, 10))) <= 12      # Smart decimal places in repr() after round.
    if x >= 0.1:                              # Implicit rounding to 12 significant digits
        assert str(x) == repr(round(x, 12))   # by str() is good enough for small errors.
        y = 1000 * x                             # Decimal type is excessive for shopping
        assert str(y) == repr(round(y, 12 - 3))  # in a supermaket with Python 2.7+ :-)

Documentos

Consulte las notas de la versión de Python 2.7: otro idioma cambia el cuarto párrafo.

conversiones Ahora hay «filas» de números de punto flotante correctamente redondeado en muchas plataformas. Estas transformaciones tienen lugar en diferentes lugares. str () flotante en números complejos; flotantes և constructores complejos; número de metros; serializar և deserializar nadadores և usando números complejos marshal, pickle Y: json módulos; analizar float և palabras imaginarias en código Python; փ փ փ Convertir de decimal a flotante.

A este respecto: desempeñar () x número de punto flotante ahora devuelve un resultado basado en la línea decimal más corta garantizada para redondear a x con el redondeo correcto (de media caña a par en modo redondo). Anteriormente, devolvía una cadena basada en el redondeo de x hasta 17 decimales.

Cuestión relacionada:


Información Adicional. de float antes de que Python 2.7 fuera como hoy numpy.float64. Ambos tipos utilizan la misma mantis de 52 bits de doble precisión IEEE 754 de 64 bits. Existe una gran diferencia np.float64.__repr__ a menudo se mide en números decimales para que no se pierdan bits, pero no hay un IEEE 754 válido para 13.9499999999999999 և 13.950000000000000001 և. El resultado no es agradable, և transformación repr(float(number_as_string)) no es reversible con fármacos. Por otra parte: float.__repr__ está dimensionado para que cada dígito pueda ser: la secuencia no tiene espacios, pero la transformación es reversible. Bastante sencillo. si probablemente tiene numpy.float64, conviértalo en un flotante normal para que pueda formatearse para las personas en lugar de para el procesamiento de números. de lo contrario, no necesita nada más con Python 2.7 +.


leer el contenido completo aqui