¿Cómo obtengo los números después de un punto decimal?
Por ejemplo, si lo tengo 5.55
, ¿cómo lo consigo .55
?
python
floating-point
decimal
l --''''''--------- '' '' '' '' '' '
fuente
fuente
Respuestas:
Un enfoque fácil para ti:
fuente
number_dec = str(number-int(number)).split('.')[1]
5.55 % 1
, que también es una respuesta más generalmente útil: se puede usar el enfoque de división de módulo en varios idiomas, mientras que la respuesta anterior es específica de Python..55
), que puede que no espere debido al título de la pregunta!str(5.55 - int(5.55))[1:]
devuelve en.5499999999999998
lugar de lo.55
mencionado en la pregunta.Tenga en cuenta que esto no le ayudará con los problemas de redondeo de coma flotante. Es decir, puede obtener:
O de lo contrario, un poco por debajo del 0,55 que espera.
fuente
modf
, también puede atornillar la precisión:math.modf(5.55)
volverá (0.5499999999999998, 5.0).x%1
fue casi dos veces más rápido que los métodosx-int(x)
ymodf(x)[0]
(los tiempos fueron 980ns, 1.39us y 1.47us promediaron más de 1000000 ejecuciones). Mi valor parax
siempre fue positivo, así que no tuve que preocuparme por eso.Utilice modf :
fuente
math.modf(2.53) = (0.5299999999999998, 2.0)
respuesta esperada es 0.53Qué pasa:
O, usando numpy:
fuente
Con el
decimal
módulo de la biblioteca estándar, puede conservar la precisión original y evitar problemas de redondeo de punto flotante:Como algunas notas en los comentarios,
float
primero tendrá que convertir los mensajes nativos en cadenas.fuente
n = 5.55
, n es un flotante, y debería hacerloDecimal(str(n)) % 1
para obtener la parte fraccionaria. (Esto no es necesario si tiene un número entero, pero no hace daño.)10.0/3 % 1
al menos en mi sistemaDecimal.from_float(1.2)
(que ahora se puede escribir comoDecimal(1.2)
) tendrá problemas de redondeo, que esta respuesta estaba tratando de evitar.Prueba el módulo:
fuente
similar a la respuesta aceptada, un enfoque aún más fácil usando cadenas sería
fuente
number = 5.55; "." in number
daTypeError: argument of type 'float' is not iterable
. ¿Y qué harías tú sinumber = 1e-5
?float
; Python no tiene ningún conocimiento de en qué formato se expresó originalmente. Minumber = 1e-5
ejemplo se aplica igualmente bien anumber = 0.00001
: lastr
representación del número está en notación científica. Por cierto , querrás lidiar con éle+
tambiéne-
.fuente
fuente
Esta es una solución que probé:
fuente
A veces, los ceros finales son importantes
fuente
Con solo usar la división de operador simple '/' y la división de piso '//' , puede obtener fácilmente la parte fraccionaria de cualquier flotante dado.
fuente
Utilice floor y reste el resultado del número original:
fuente
import math
, ¿por qué no usarlomath.modf()
?math.floor(-1.1) == -2
peroint(-1.1) == -1
. Aunque para esta pregunta usarint
es más correcto.Los números flotantes no se almacenan en formato decimal (base10). Lea la documentación de Python sobre esto para saber por qué. Por lo tanto, no es aconsejable obtener una representación en base 10 de un flotante.
Ahora existen herramientas que permiten el almacenamiento de datos numéricos en formato decimal. A continuación se muestra un ejemplo con la
Decimal
biblioteca.fuente
Ejemplo:
Esto le dará dos números después del punto decimal, 55 de ese ejemplo. Si necesita un número, reduce en 10 los cálculos anteriores o aumenta dependiendo de cuántos números desee después del decimal.
fuente
Definitivamente funcionó
fuente
Qué pasa:
Salida:
print(b)
0.23399999999999999
round(b, length-2)
0.234
Dado que la ronda se envía a la longitud de la cadena de decimales ('0.234'), podemos simplemente menos 2 para no contar el '0.' y calcular el número deseado de puntos decimales. Esto debería funcionar la mayoría de las veces, a menos que tenga muchos lugares decimales y el error de redondeo al calcular b interfiera con el segundo parámetro de round.
fuente
Es posible que desee probar esto:
Regresará
0.55
.fuente
salida: 0.55
fuente
Vea lo que hago a menudo para obtener números después del punto decimal en Python 3:
fuente
Si está usando pandas:
fuente
Otra opción sería usar el
re
módulo conre.findall
ore.search
:Salida
Si desea simplificar / modificar / explorar la expresión, se explica en el panel superior derecho de regex101.com . Si lo desea, también puede ver en este enlace cómo coincidiría con algunas entradas de muestra.
Fuente
¿Cómo deshacerse de números flotantes adicionales en la resta de Python?
fuente
Descubrí que números realmente grandes con partes fraccionarias realmente grandes pueden causar problemas al usar el módulo 1 para obtener la fracción.
En lugar de eso, tomé la parte integral y la resté primero para ayudar a simplificar el resto.
fuente
Otro ejemplo usando modf
fuente
Una solución es usar módulo y redondeo.
Tu salida será 0.55
fuente
Puedes usar esto:
fuente
Otra solución loca es (sin convertir en una cadena):
fuente