2017-01-07 14 views
5

Potrzebuję obcinać typy dziesiętne bez zaokrąglania & zachować typ dziesiętny, w sposób jak najbardziej wydajny procesor.Jak skrócić typ i zachowanie typu dziesiętnego jako typ dziesiętny bez zaokrąglania?

Opcje matematyczne, które moim zdaniem zwracają wartość zmiennoprzecinkową.

Opcja kwantyzacji zwraca zaokrągloną liczbę, w którą wierzę.

Opcje Str są kosztowne dla procesora.

Czy istnieje prosty, bezpośredni sposób na proste odcięcie cyfr po przecinku o określonej długości dziesiętnej?

+0

Chcesz faktycznie obcina wartość numeryczną, czy trzeba reprezentację ciąg wartości z określonej liczby cyfr? – mkrieger1

+0

Potrzebuję, aby wynik końcowy był typu dziesiętnego. Nie chcę konwertować zi na str. Mam dużo liczb do przetworzenia. To by dodało zbyt wiele czasu przetwarzania. – Emily

+0

Kiedy mówisz "dziesiętny", masz na myśli "dziesiętny" numer "? –

Odpowiedz

7

Sposób quantize ma parametr , regulującym wartość jest zaokrąglona. Opcja ROUND_DOWN wydaje się robić to, co chcesz:

  • ROUND_DOWN (do zera)
from decimal import Decimal, ROUND_DOWN 

def truncate_decimal(d, places): 
    """Truncate Decimal d to the given number of places. 

    >>> truncate_decimal(Decimal('1.234567'), 4) 
    Decimal('1.2345') 
    >>> truncate_decimal(Decimal('-0.999'), 1) 
    Decimal('-0.9') 
    """ 
    return d.quantize(Decimal(10) ** -places, rounding=ROUND_DOWN) 
0

odciąć dziesiętne przeszłości (na przykład), drugie miejsce po przecinku:

from math import floor 
x = 3.14159 
x2 = floor(x * 100)/100 
0

Jeśli rozumiem zostanie poprawnie można użyć divmod (jest to funkcja build-in). Dzieli się na całkowitą liczbę i dziesiętnych części:

>>> import decimal 
>>> d1 = decimal.Decimal(3.14) 
>>> divmod(d1, 1)[0] 
Decimal('3') 
>>> d2 = decimal.Decimal(5.64) 
>>> divmod(d2, 1)[0] 
Decimal('5') 
1

Jeśli masz decimal np

num = Decimal('3.14159261034899999') 

cię może zrobić:

getcontext().prec = 13    # set the precision (no. of digits) 
getcontext().rounding = ROUND_DOWN # this will effectively truncate 

num *= 1 

Używanie tego dostaniesz (print(num)):

3.141592610348