Мне нужно обрезать десятичные типы без округления и сохранять десятичный тип наиболее эффективным из возможных способов.

Варианты Math, которые я считаю, возвращают число с плавающей точкой

Опция квантования возвращает округленное число, которое я считаю.

Str опции являются дорогостоящими.

Есть ли простой прямой способ просто вырезать цифры из десятичного типа после указанной десятичной длины?

10
Emily 7 Янв 2017 в 19:06

4 ответа

Лучший ответ

quantize имеет метод { Параметр {X1}}, который управляет округлением значения. ROUND_DOWN, кажется, выполняет то, что вы хотите :

  • ROUND_DOWN (к нулю)
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)
9
mkrieger1 7 Янв 2017 в 16:32

Если я вас правильно понимаю, вы можете использовать divmod (это встроенная функция). Он разбивает число на целые и десятичные части:

>>> import decimal
>>> d1 = decimal.Decimal(3.14)
>>> divmod(d1, 1)[0]
Decimal('3')
>>> d2 = decimal.Decimal(5.64)
>>> divmod(d2, 1)[0]
Decimal('5')
0
Fomalhaut 7 Янв 2017 в 16:28

Если у вас есть, например, десятичный

num = Decimal('3.14159261034899999')

Ты можешь сделать:

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

num *= 1

Используя это, вы получите (print(num)):

3.141592610348
1
Keiwan 7 Янв 2017 в 16:32

Чтобы отрезать десятичные дроби после (например) второго десятичного знака:

from math import floor
x = 3.14159
x2 = floor(x * 100) / 100
0
Willis Blackburn 7 Янв 2017 в 16:22