Como obtenho os números após um ponto decimal?
Por exemplo, se eu tiver 5.55
, como recebo .55
?
Como obtenho os números após um ponto decimal?
Por exemplo, se eu tiver 5.55
, como recebo .55
?
Respostas:
Uma abordagem fácil para você:
number_dec = str(number-int(number))[1:]
number_dec = str(number-int(number)).split('.')[1]
5.55 % 1
que também é uma resposta mais geralmente útil - é possível usar a abordagem de divisão de módulos em vários idiomas, enquanto a resposta acima é específica para Python.
.55
), que você não pode esperar devido ao título das perguntas!
str(5.55 - int(5.55))[1:]
retorna em .5499999999999998
vez do .55
mencionado na pergunta.
5.55 % 1
Lembre-se de que isso não ajudará em problemas de arredondamento de ponto flutuante. Ou seja, você pode obter:
0.550000000001
Ou então, um pouco de 0,55 que você está esperando.
modf
, também pode estragar a precisão: math.modf(5.55)
retornará (0.5499999999999998, 5.0).
x%1
era quase duas vezes mais rápido que os métodos x-int(x)
e modf(x)[0]
(os tempos eram 980ns, 1,39us e 1,47us, em média, em 1000000 execuções). Meu valor x
sempre foi positivo, então não precisei me preocupar com isso.
Use modf :
>>> import math
>>> frac, whole = math.modf(2.5)
>>> frac
0.5
>>> whole
2.0
math.modf(2.53) = (0.5299999999999998, 2.0)
resposta esperada é 0,53
A respeito:
a = 1.3927278749291
b = a - int(a)
b
>> 0.39272787492910011
Ou, usando numpy:
import numpy
a = 1.3927278749291
b = a - numpy.fix(a)
Usando o decimal
módulo da biblioteca padrão, você pode manter a precisão original e evitar problemas de arredondamento de ponto flutuante:
>>> from decimal import Decimal
>>> Decimal('4.20') % 1
Decimal('0.20')
Como notas gentis nos comentários, você precisará primeiro converter s nativos em strings.float
n = 5.55
, n é uma bóia e deve fazer Decimal(str(n)) % 1
para obter a parte fracionária. (Isto não é necessário se você tiver um inteiro, mas não faz mal.)
10.0/3 % 1
pelo menos no meu sistema
Decimal.from_float(1.2)
(que agora pode ser escrito como Decimal(1.2)
), você terá problemas de arredondamento, os quais esta resposta estava tentando evitar.
semelhante à resposta aceita, uma abordagem ainda mais fácil usando strings seria
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
dá TypeError: argument of type 'float' is not iterable
. E o que você faria se number = 1e-5
?
float
; O Python não mantém nenhum conhecimento de qual formato foi originalmente expresso. Meu number = 1e-5
exemplo se aplica igualmente bem a number = 0.00001
: a str
representação do número está em notação científica. Você vai querer lidar com e+
, bem como e-
, a propósito.
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
Às vezes, zeros à direita importam
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)
Use floor e subtraia o resultado do 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 que não usar math.modf()
?
math.floor(-1.1) == -2
mas int(-1.1) == -1
. Embora para esta pergunta usando int
é mais correto.
Os números flutuantes não são armazenados no formato decimal (base10). Leia a documentação do python sobre isso para entender por que. Portanto, não é aconselhável obter uma representação base10 de um flutuador.
Agora, existem ferramentas que permitem o armazenamento de dados numéricos em formato decimal. Abaixo está um exemplo usando a Decimal
biblioteca.
from decimal import *
x = Decimal('0.341343214124443151466')
str(x)[-2:] == '66' # True
y = 0.341343214124443151466
str(y)[-2:] == '66' # False
Exemplo:
import math
x = 5.55
print((math.floor(x*100)%100))
Isso fornecerá dois números após o ponto decimal, 55 desse exemplo. Se você precisar de um número, reduz em 10 os cálculos acima ou aumenta dependendo de quantos números deseja após o decimal.
A respeito:
a = 1.234
b = a - int(a)
length = len(str(a))
round(b, length-2)
Resultado:
print(b)
0.23399999999999999
round(b, length-2)
0.234
Como a rodada é enviada para o comprimento da sequência de decimais ('0,234'), podemos apenas menos 2 para não contar o '0' e descobrir o número desejado de pontos decimais. Isso deve funcionar na maioria das vezes, a menos que você tenha muitas casas decimais e o erro de arredondamento ao calcular b interfere no segundo parâmetro da rodada.
Você pode tentar o seguinte:
your_num = 5.55
n = len(str(int(your_num)))
float('0' + str(your_num)[n:])
Voltará 0.55
.
number=5.55
decimal=(number-int(number))
decimal_1=round(decimal,2)
print(decimal)
print(decimal_1)
saída: 0.55
Outra opção seria usar o re
módulo com re.findall
ou 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
Se você deseja simplificar / modificar / explorar a expressão, isso foi explicado no painel superior direito de regex101.com . Se desejar, também é possível assistir neste link , como ele corresponderia a algumas entradas de amostra.
Como se livrar de números flutuantes adicionais na subtração python?
Descobri que números muito grandes com partes fracionárias muito grandes podem causar problemas ao usar o módulo 1 para obter a fração.
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'>]
Peguei a parte integrante e subtraí-a primeiro para ajudar a simplificar o restante.
>>> d - d.to_integral()
Decimal('0.1231200000000000000002013210')
Outro exemplo 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
Uma solução está usando módulo e arredondamento.
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)))
Sua saída será 0,55
Você pode usar isto:
number = 5.55
int(str(number).split('.')[1])