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 % 1que 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 .5499999999999998vez do .55mencionado 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%1era 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 xsempre 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 decimalmó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)) % 1para obter a parte fracionária. (Isto não é necessário se você tiver um inteiro, mas não faz mal.)
10.0/3 % 1pelo 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 numberdá 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-5exemplo se aplica igualmente bem a number = 0.00001: a strrepresentaçã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) == -2mas 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 Decimalbiblioteca.
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 remódulo com re.findallou 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])