Po znalezieniu sposobu rozwiązania tego problemu, bez ładowania jakiegokolwiek modułu Python 3 lub dodatkowych operacji matematycznych, rozwiązałem problem, używając tylko funkcji str.format() e. Float().Myślę, że ten sposób jest szybszy niż w przypadku innych operacji matematycznych, jak w przypadku najbardziej popularnego rozwiązania. Potrzebowałem szybkiego rozwiązania, ponieważ pracuję z bardzo dużym zbiorem danych i dlatego działa on bardzo dobrze tutaj.
def truncate_number(f_number, n_decimals):
strFormNum = "{0:." + str(n_decimals+5) + "f}"
trunc_num = float(strFormNum.format(f_number)[:-5])
return(trunc_num)
# Testing the 'trunc_num()' function
test_num = 1150/252
[(idx, truncate_number(test_num, idx)) for idx in range(0, 20)]
Zwraca następujący wynik:
[(0, 4.0),
(1, 4.5),
(2, 4.56),
(3, 4.563),
(4, 4.5634),
(5, 4.56349),
(6, 4.563492),
(7, 4.563492),
(8, 4.56349206),
(9, 4.563492063),
(10, 4.5634920634),
(11, 4.56349206349),
(12, 4.563492063492),
(13, 4.563492063492),
(14, 4.56349206349206),
(15, 4.563492063492063),
(16, 4.563492063492063),
(17, 4.563492063492063),
(18, 4.563492063492063),
(19, 4.563492063492063)]
Nie ma takiej wartości w zestawie, które są reprezentowane przez liczb zmiennoprzecinkowych. –
Na wypadek, gdyby komentarz Karla nie był wystarczająco wyraźny: * Nie ma * takiej liczby * jak 1324343032.324 w binarnym zmiennoprzecinkowym. Jeśli zmienisz wersję Pythona na wyższą (2.7 lub 3.1 lub nowsza), interpreter * wyświetli * 1324343032.324 dla ciebie. Ale w rzeczywistości liczba, z którą się liczysz, nie jest ani 1324343032.324, ani 1324343032.3239999 niezależnie od wersji Pythona. Jedynym sposobem uzyskania * dokładnie * 1324343032.324 jest użycie modułu 'decimal' lub jakiejś innej arbitralnej, precyzyjnej biblioteki matematycznej, takiej jak' gmpy'. –
Przyjęta poniżej odpowiedź jest poprawna, jeśli chcesz zaokrąglić (w górę) do określonej liczby miejsc dziesiętnych. Jednak pytanie, które zadaje, i to, co chciałem wiedzieć, to sposób obcięcia do określonej liczby miejsc dziesiętnych. Dla mnie '% .3f '% (1324343032.3243)' i ''% .3f '% (1324343032.3245) dają różne wyniki. (Używam Pythona 2.7.8). – nullstellensatz