Jak uzyskać liczby po przecinku?
Na przykład, jeśli mam 5.55
, w jaki sposób otrzymam .55
?
Jak uzyskać liczby po przecinku?
Na przykład, jeśli mam 5.55
, w jaki sposób otrzymam .55
?
Odpowiedzi:
Łatwe podejście dla Ciebie:
number_dec = str(number-int(number))[1:]
number_dec = str(number-int(number)).split('.')[1]
5.55 % 1
która jest również bardziej użyteczną odpowiedzią - można zastosować podejście dzielenia modulo w wielu językach, podczas gdy powyższa odpowiedź jest specyficzna dla Pythona.
.55
), czego możesz się nie spodziewać ze względu na tytuł pytania!
str(5.55 - int(5.55))[1:]
zwraca .5499999999999998
zamiast .55
wymienionego w pytaniu.
5.55 % 1
Pamiętaj, że nie pomoże ci to w problemach z zaokrąglaniem zmiennoprzecinkowym. To znaczy, możesz otrzymać:
0.550000000001
Lub w przeciwnym razie trochę poniżej 0,55, którego oczekujesz.
modf
, może też wkręcić precyzję: math.modf(5.55)
zwróci (0.5499999999999998, 5.0).
x%1
była prawie dwukrotnie szybsza niż metody x-int(x)
i modf(x)[0]
(czasy 980ns, 1,39us i 1,47us uśrednione dla 1000000 uruchomień). Moja wartość x
zawsze była pozytywna, więc nie musiałem się o to martwić.
Użyj modf :
>>> import math
>>> frac, whole = math.modf(2.5)
>>> frac
0.5
>>> whole
2.0
math.modf(2.53) = (0.5299999999999998, 2.0)
oczekiwana odpowiedź to 0,53
Co powiesz na:
a = 1.3927278749291
b = a - int(a)
b
>> 0.39272787492910011
Lub używając numpy:
import numpy
a = 1.3927278749291
b = a - numpy.fix(a)
Używając decimal
modułu z biblioteki standardowej, możesz zachować oryginalną precyzję i uniknąć problemów z zaokrąglaniem zmiennoprzecinkowym:
>>> from decimal import Decimal
>>> Decimal('4.20') % 1
Decimal('0.20')
Jak zauważa kindall w komentarzach, musisz najpierw przekonwertować natywne s na ciągi znaków.float
n = 5.55
, n jest liczbą zmiennoprzecinkową i powinieneś zrobić, Decimal(str(n)) % 1
aby uzyskać część ułamkową. (Nie jest to konieczne, jeśli masz liczbę całkowitą, ale to nie boli.)
10.0/3 % 1
przynajmniej w moim systemie
Decimal.from_float(1.2)
(które można teraz zapisać jako Decimal(1.2)
), będziesz mieć zaokrąglone problemy, których próbowała uniknąć ta odpowiedź.
podobnie jak przyjęta odpowiedź, jeszcze prostszym podejściem byłoby użycie łańcuchów
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
daje TypeError: argument of type 'float' is not iterable
. A co byś zrobił, gdybyś number = 1e-5
?
float
; Python nie posiada żadnej wiedzy o tym, w jakim formacie został pierwotnie wyrażony. Mój number = 1e-5
przykład odnosi się równie dobrze do number = 0.00001
: str
reprezentacja liczby jest w notacji naukowej. Będziesz mieć do czynienia z e+
, jak i e-
, nawiasem mówiąc.
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
Czasami liczą się zera końcowe
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)
Użyj podłogi i odejmij wynik od oryginalnej liczby:
>> 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
, dlaczego po prostu nie użyć math.modf()
?
math.floor(-1.1) == -2
ale int(-1.1) == -1
. Chociaż w przypadku tego pytania użycie int
jest bardziej poprawne.
Liczby zmiennoprzecinkowe nie są przechowywane w formacie dziesiętnym (podstawa 10). Przeczytaj dokumentację Pythona na ten temat, aby upewnić się, dlaczego. Dlatego uzyskanie reprezentacji o podstawie 10 z liczby zmiennoprzecinkowej nie jest zalecane.
Teraz są narzędzia, które umożliwiają przechowywanie danych liczbowych w formacie dziesiętnym. Poniżej przykład z wykorzystaniem Decimal
biblioteki.
from decimal import *
x = Decimal('0.341343214124443151466')
str(x)[-2:] == '66' # True
y = 0.341343214124443151466
str(y)[-2:] == '66' # False
Przykład:
import math
x = 5.55
print((math.floor(x*100)%100))
To da ci dwie liczby po przecinku, 55 z tego przykładu. Jeśli potrzebujesz jednej liczby, zmniejsz o 10 powyższe obliczenia lub zwiększ w zależności od tego, ile liczb chcesz po przecinku.
import math
x = 1245342664.6
print( (math.floor(x*1000)%1000) //100 )
To zdecydowanie zadziałało
Co powiesz na:
a = 1.234
b = a - int(a)
length = len(str(a))
round(b, length-2)
Wynik:
print(b)
0.23399999999999999
round(b, length-2)
0.234
Ponieważ runda jest wysyłana do długości ciągu liczb dziesiętnych („0,234”), możemy odjąć 2, aby nie policzyć „0” i obliczyć żądaną liczbę miejsc dziesiętnych. Powinno to działać w większości przypadków, chyba że masz dużo miejsc po przecinku, a błąd zaokrąglania podczas obliczania b koliduje z drugim parametrem rundy.
Możesz spróbować tego:
your_num = 5.55
n = len(str(int(your_num)))
float('0' + str(your_num)[n:])
Wróci 0.55
.
number=5.55
decimal=(number-int(number))
decimal_1=round(decimal,2)
print(decimal)
print(decimal_1)
wyjście: 0,55
Inną opcją byłoby użycie re
modułu z re.findall
lub 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
Jeśli chcesz uprościć / zmodyfikować / zbadać wyrażenie, zostało to wyjaśnione w prawym górnym panelu regex101.com . Jeśli chcesz, możesz również obejrzeć w tym linku , jak to będzie się zgadzać z niektórymi przykładowymi danymi wejściowymi.
Jak pozbyć się dodatkowych liczb zmiennoprzecinkowych w odejmowaniu w Pythonie?
Odkryłem, że naprawdę duże liczby z naprawdę dużymi częściami ułamkowymi mogą powodować problemy podczas używania modulo 1 do uzyskania ułamka.
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'>]
Zamiast tego złapałem integralną część i odjąłem ją najpierw, aby uprościć resztę.
>>> d - d.to_integral()
Decimal('0.1231200000000000000002013210')
Kolejny przykład użycia 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
Rozwiązaniem jest użycie modulo i zaokrąglanie.
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)))
Twój wynik wyniesie 0,55
Możesz użyć tego:
number = 5.55
int(str(number).split('.')[1])