Jak sugeruje tytuł, chcę wziąć liczbę zmiennoprzecinkową i zaokrąglić ją w dół do najbliższej liczby całkowitej. Jeśli jednak nie jest to całość, ZAWSZE chcę zaokrąglić zmienną w dół, niezależnie od tego, jak blisko jest do następnej liczby całkowitej w górę. Czy jest na to sposób?
python
floating-point
integer
rounding
Anthony Perez
źródło
źródło
Odpowiedzi:
Prosty
zadziała również.
źródło
int(-23.3) == 23
Jeden z nich powinien działać:
źródło
math.trunc
jest liczbą całkowitą, a wyjściemath.floor
jest zmiennoprzecinkową.type(math.floor(1.51)) -> int
atype(math.trunc(1.51)) -> int
odpython 3.6.0
//
Zwraca te podłogi przegrody. Ponieważ dzielenie przez 1 nie zmienia liczby, jest to równoważne z podłogą, ale import nie jest potrzebny. Uwagi:źródło
int(-1.1) == -1
jednocześnie-1.1//1 == -2.0
jednakdecimal.Decimal('-1.1')//1 == decimal.Decimal('-1')
(jak udokumentowane roszczenia 2 nie odnosi się dodecimal
), więc opierając się na temat sposobów//
zachowuje się nie jest w pełni stabilna, nawet dzisiaj.Aby otrzymać wynik zmiennoprzecinkowy, po prostu użyj:
Działa również w przypadku liczb ujemnych.
źródło
Myślę, że potrzebujesz funkcji podłogi:
podłoga matematyczna (x)
źródło
wiele osób mówi, aby używać
int(x)
, i to działa dobrze w większości przypadków, ale jest mały problem. Jeśli wynik OP to:to się zaokrągli
po 16. 9 to zaokrągli. To nic wielkiego, jeśli masz pewność, że nigdy nie spotkasz się z czymś takim. Ale warto o tym pamiętać.
źródło
1.9999999999999999
jest równy2.0
. I. e. jest już zaokrąglany, gdy tylko zostanie przetworzony na liczbę zmiennoprzecinkową, ponieważ 64-bitowa liczba zmiennoprzecinkowa nie może reprezentować tylu znaczących cyfr. Możesz to zweryfikować oceniając1.9999999999999999 == 2.0
. A jeśli podejrzewasz, że operacja równości powoduje pewne zaokrąglenia na liczbach zmiennoprzecinkowych, możesz porównać reprezentację binarną zstruct.pack("d", 1.9999999999999999) == struct.pack("d", 2.0)
, która również jest równa.int()
. Wartość jest już 2,0 i szczęśliwie zamieni ją na 2.int()
, ma to związek wyłącznie z niewłaściwym użyciem programufloat
, który1.9999999999999999
jest zaokrąglany w górę2.0
w czasie kompilacji (podczas gdyint()
jest wywoływana w czasie wykonywania). Jeśli użyjesz odpowiedniego typu danych dla zmiennej, wszystko działa zgodnie z oczekiwaniami:int(decimal.Decimal('1.9999999999999999999999999999999999999999999999999999999'))
daje1
Jeśli nie chcesz importować matematyki, możesz użyć:
int(round(x))
Oto fragment dokumentacji:
źródło
round
była już omawiana i odrzucana jako odpowiedź, gdy to pytanie zostało zadane rok temu. OP chcemath.floor
.Jeśli pracujesz z numpy, możesz użyć następującego rozwiązania, które działa również z liczbami ujemnymi (działa również na tablicach)
Myślę, że zadziała również, jeśli użyjesz
math
modułu zamiastnumpy
modułu.źródło
Nie wiem, czy to rozwiązałeś, ale właśnie natknąłem się na to pytanie. Jeśli chcesz pozbyć się kropek dziesiętnych, możesz użyć int (x), co wyeliminuje wszystkie cyfry dziesiętne. Nie ma potrzeby używania round (x).
źródło
Po prostu zaokrąglij (x-0,5), co zawsze zwróci następną zaokrągloną w dół wartość całkowitą twojego Float. Możesz również łatwo zaokrąglić w górę, wykonując rundę (x + 0,5)
źródło
To może być bardzo proste, ale czy nie można by po prostu zaokrąglić do minus 1? Na przykład:
źródło
integer
.Użyłem tego kodu, w którym odejmujesz 0,5 od liczby, a kiedy ją zaokrąglasz, jest to pierwotna liczba zaokrąglona w dół.
źródło