Jak uzyskać liczby po przecinku?
Na przykład, jeśli mam 5.55
, w jaki sposób otrzymam .55
?
python
floating-point
decimal
l --''''''--------- '' '' '' '' '' ''
źródło
źródło
Odpowiedzi:
Łatwe podejście dla Ciebie:
źródło
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.Pamiętaj, że nie pomoże ci to w problemach z zaokrąglaniem zmiennoprzecinkowym. To znaczy, możesz otrzymać:
Lub w przeciwnym razie trochę poniżej 0,55, którego oczekujesz.
źródło
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ż metodyx-int(x)
imodf(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 :
źródło
math.modf(2.53) = (0.5299999999999998, 2.0)
oczekiwana odpowiedź to 0,53Co powiesz na:
Lub używając numpy:
źródło
Używając
decimal
modułu z biblioteki standardowej, możesz zachować oryginalną precyzję i uniknąć problemów z zaokrąglaniem zmiennoprzecinkowym:Jak zauważa kindall w komentarzach, musisz najpierw przekonwertować natywne s na ciągi znaków.
float
źródło
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 systemieDecimal.from_float(1.2)
(które można teraz zapisać jakoDecimal(1.2)
), będziesz mieć zaokrąglone problemy, których próbowała uniknąć ta odpowiedź.Wypróbuj Modulo:
źródło
podobnie jak przyjęta odpowiedź, jeszcze prostszym podejściem byłoby użycie łańcuchów
źródło
number = 5.55; "." in number
dajeTypeError: 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ójnumber = 1e-5
przykład odnosi się równie dobrze donumber = 0.00001
:str
reprezentacja liczby jest w notacji naukowej. Będziesz mieć do czynienia ze+
, jak ie-
, nawiasem mówiąc.źródło
źródło
Oto rozwiązanie, które wypróbowałem:
źródło
Czasami liczą się zera końcowe
źródło
Używając prostego dzielenia przez operatora „/” i podziału „//” , można łatwo uzyskać część ułamkową dowolnej liczby zmiennoprzecinkowej.
źródło
Użyj podłogi i odejmij wynik od oryginalnej liczby:
źródło
import math
, dlaczego po prostu nie użyćmath.modf()
?math.floor(-1.1) == -2
aleint(-1.1) == -1
. Chociaż w przypadku tego pytania użycieint
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.źródło
Przykład:
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.
źródło
To zdecydowanie zadziałało
źródło
Co powiesz na:
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.
źródło
Możesz spróbować tego:
Wróci
0.55
.źródło
wyjście: 0,55
źródło
Zobacz, co często robię, aby uzyskać liczby po przecinku w Pythonie 3:
źródło
Jeśli używasz pand:
źródło
Inną opcją byłoby użycie
re
modułu zre.findall
lubre.search
:Wynik
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.
Źródło
Jak pozbyć się dodatkowych liczb zmiennoprzecinkowych w odejmowaniu w Pythonie?
źródło
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.
Zamiast tego złapałem integralną część i odjąłem ją najpierw, aby uprościć resztę.
źródło
Kolejny przykład użycia modf
źródło
Rozwiązaniem jest użycie modulo i zaokrąglanie.
Twój wynik wyniesie 0,55
źródło
Możesz użyć tego:
źródło
Kolejnym szalonym rozwiązaniem jest (bez konwersji w string):
źródło