saber numero español entero como python decimal

español - como saber si un numero es entero en python



Flotador de Python a conversión decimal (7)

Cuando dice "preservar el valor como el usuario ha ingresado", ¿por qué no simplemente almacenar el valor ingresado por el usuario como una cadena y pasarlo al constructor de Decimal?

Python Decimal no admite que se construya desde float; espera que primero tenga que convertir float en una cadena.

Esto es muy inconveniente ya que los formateadores de cadenas estándar para flotación requieren que especifique el número de decimales en lugar de lugares significativos. Por lo tanto, si tiene un número que podría tener hasta 15 lugares decimales, debe formatear como Decimal (""%. 15f "% my_float), lo que le proporcionará la basura en el decimo decimal si también tiene dígitos significativos antes. decimal.

¿Puede alguien sugerir una buena forma de convertir de flotante a valor de preservación decimal como el usuario ha ingresado, quizás limitando el número de dígitos significativos que pueden ser soportados?


La representación de cadena "oficial" de un flotante viene dada por el repr () incorporado:

>>> repr(1.5) ''1.5'' >>> repr(12345.678901234567890123456789) ''12345.678901234567''

Puede usar repr () en lugar de una cadena formateada, el resultado no contendrá ninguna basura innecesaria.


Usted dijo en su pregunta:

¿Alguien puede sugerir una buena forma de convertir de flotante a un valor de preservación decimal como el usuario ha ingresado

Pero cada vez que el usuario ingresa un valor, se ingresa como una cadena, no como un flotador. Lo estás convirtiendo en una carroza en algún lugar. Convierta en Decimal directamente en su lugar y no se perderá precisión.


Python no admite la creación de decimales desde un flotante. Usted acaba de lanzarlo como una cadena primero. Pero la pérdida de precisión no ocurre con la conversión de cadenas. El flotador que está convirtiendo no tiene ese tipo de precisión en primer lugar. (De lo contrario, no necesitarías Decimal)

Creo que la confusión aquí es que podemos crear literales flotantes en formato decimal , pero tan pronto como el intérprete consume ese literal, la representación interna se convierte en un número de coma flotante.


Python <2.7

"%.15g" % f

O en Python 3.0:

format(f, ".15g")

Python 2.7+, 3.2+

Simplemente pase el float al constructor de Decimal directamente.


Sugiero esto

>>> a = 2.111111 >>> a 2.1111110000000002 >>> str(a) ''2.111111'' >>> decimal.Decimal(str(a)) Decimal(''2.111111'')


La forma "correcta" de hacerlo fue documentada en 1990 por los documentos PLDI 1990 de Steele and White y Clinger .

También puede ver este debate sobre SO sobre Python Decimal, incluida mi sugerencia de intentar usar algo como frap para racionalizar un flotador.