如何截断十进制类型&保留为十进制类型而不进行舍入?

时间:2017-01-07 16:06:02

标签: python python-3.x

我需要截断十进制类型而不进行舍入和放大保留十进制类型,以尽可能高效的处理器方式。

我认为数学选项会返回浮点数。

量化选项返回我认为的舍入数字。

Str选项是处理器成本高昂的方法。

是否有一种简单,直接的方法可以简单地将数字从十进制类型中删除超过指定的十进制长度?

4 个答案:

答案 0 :(得分:8)

quantize方法确实有一个rounding参数,用于控制值的舍入方式。 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)

答案 1 :(得分:1)

如果您有decimal,例如

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

答案 2 :(得分:0)

要删除小数点后的(例如)第二个小数位:

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

答案 3 :(得分:0)

如果我理解正确,您可以使用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')