¿Cómo obtengo los números después de un punto decimal?
Por ejemplo, si lo tengo 5.55
, ¿cómo lo consigo .55
?
¿Cómo obtengo los números después de un punto decimal?
Por ejemplo, si lo tengo 5.55
, ¿cómo lo consigo .55
?
Respuestas:
Un enfoque fácil para ti:
number_dec = str(number-int(number))[1:]
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.
5.55 % 1
Tenga en cuenta que esto no le ayudará con los problemas de redondeo de coma flotante. Es decir, puede obtener:
0.550000000001
O de lo contrario, un poco por debajo del 0,55 que espera.
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étodos x-int(x)
y modf(x)[0]
(los tiempos fueron 980ns, 1.39us y 1.47us promediaron más de 1000000 ejecuciones). Mi valor para x
siempre fue positivo, así que no tuve que preocuparme por eso.
Utilice modf :
>>> import math
>>> frac, whole = math.modf(2.5)
>>> frac
0.5
>>> whole
2.0
math.modf(2.53) = (0.5299999999999998, 2.0)
respuesta esperada es 0.53
Qué pasa:
a = 1.3927278749291
b = a - int(a)
b
>> 0.39272787492910011
O, usando numpy:
import numpy
a = 1.3927278749291
b = a - numpy.fix(a)
Con el decimal
módulo de la biblioteca estándar, puede conservar la precisión original y evitar problemas de redondeo de punto flotante:
>>> from decimal import Decimal
>>> Decimal('4.20') % 1
Decimal('0.20')
Como algunas notas en los comentarios, float
primero tendrá que convertir los mensajes nativos en cadenas.
n = 5.55
, n es un flotante, y debería hacerlo Decimal(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 sistema
Decimal.from_float(1.2)
(que ahora se puede escribir como Decimal(1.2)
) tendrá problemas de redondeo, que esta respuesta estaba tratando de evitar.
similar a la respuesta aceptada, un enfoque aún más fácil usando cadenas sería
def number_after_decimal(number1):
number = str(number1)
if 'e-' in number: # scientific notation
number_dec = format(float(number), '.%df'%(len(number.split(".")[1].split("e-")[0])+int(number.split('e-')[1])))
elif "." in number: # quick check if it is decimal
number_dec = number.split(".")[1]
return number_dec
number = 5.55; "." in number
da TypeError: argument of type 'float' is not iterable
. ¿Y qué harías tú si number = 1e-5
?
float
; Python no tiene ningún conocimiento de en qué formato se expresó originalmente. Mi number = 1e-5
ejemplo se aplica igualmente bien a number = 0.00001
: la str
representación del número está en notación científica. Por cierto , querrás lidiar con él e+
también e-
.
import math
orig = 5.55
whole = math.floor(orig) # whole = 5.0
frac = orig - whole # frac = 0.55
>>> n=5.55
>>> if "." in str(n):
... print "."+str(n).split(".")[-1]
...
.55
A veces, los ceros finales son importantes
In [4]: def split_float(x):
...: '''split float into parts before and after the decimal'''
...: before, after = str(x).split('.')
...: return int(before), (int(after)*10 if len(after)==1 else int(after))
...:
...:
In [5]: split_float(105.10)
Out[5]: (105, 10)
In [6]: split_float(105.01)
Out[6]: (105, 1)
In [7]: split_float(105.12)
Out[7]: (105, 12)
Utilice floor y reste el resultado del número original:
>> import math #gives you floor.
>> t = 5.55 #Give a variable 5.55
>> x = math.floor(t) #floor returns t rounded down to 5..
>> z = t - x #z = 5.55 - 5 = 0.55
import math
, ¿por qué no usarlo math.modf()
?
math.floor(-1.1) == -2
pero int(-1.1) == -1
. Aunque para esta pregunta usar int
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.
from decimal import *
x = Decimal('0.341343214124443151466')
str(x)[-2:] == '66' # True
y = 0.341343214124443151466
str(y)[-2:] == '66' # False
Ejemplo:
import math
x = 5.55
print((math.floor(x*100)%100))
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.
import math
x = 1245342664.6
print( (math.floor(x*1000)%1000) //100 )
Definitivamente funcionó
Qué pasa:
a = 1.234
b = a - int(a)
length = len(str(a))
round(b, length-2)
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.
Es posible que desee probar esto:
your_num = 5.55
n = len(str(int(your_num)))
float('0' + str(your_num)[n:])
Regresará 0.55
.
number=5.55
decimal=(number-int(number))
decimal_1=round(decimal,2)
print(decimal)
print(decimal_1)
salida: 0.55
Otra opción sería usar el re
módulo con re.findall
o re.search
:
import re
def get_decimcal(n: float) -> float:
return float(re.search(r'\.\d+', str(n)).group(0))
def get_decimcal_2(n: float) -> float:
return float(re.findall(r'\.\d+', str(n))[0])
def get_int(n: float) -> int:
return int(n)
print(get_decimcal(5.55))
print(get_decimcal_2(5.55))
print(get_int(5.55))
0.55
0.55
5
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.
¿Cómo deshacerse de números flotantes adicionales en la resta de Python?
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.
import decimal
>>> d = decimal.Context(decimal.MAX_PREC).create_decimal(
... '143000000000000000000000000000000000000000000000000000000000000000000000000000.1231200000000000000002013210000000'
... )
...
>>> d % 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
decimal.InvalidOperation: [<class 'decimal.DivisionImpossible'>]
En lugar de eso, tomé la parte integral y la resté primero para ayudar a simplificar el resto.
>>> d - d.to_integral()
Decimal('0.1231200000000000000002013210')
Otro ejemplo usando modf
from math import modf
number = 1.0124584
# [0] decimal, [1] integer
result = modf(number)
print(result[0])
# output = 0124584
print(result[1])
# output = 1
Una solución es usar módulo y redondeo.
import math
num = math.fabs(float(5.55))
rem = num % 1
rnd_by = len(str(num)) - len(str(int(num))) - 1
print(str(round(rem,rnd_by)))
Tu salida será 0.55
Puedes usar esto:
number = 5.55
int(str(number).split('.')[1])