在十进制python中强制执行精度

时间:2016-09-12 14:35:14

标签: python decimal precision

在某些环境中,精确小数(数字,数字......)是使用scaleprecision定义的,其中缩放是所有有效数字,精度是小数点右边的精度。如果铸造字符串的精度高于实现定义的精度,我想使用python的十进制实现来引发错误。

例如,我有一个环境,scale = 4precision = 2。 如何实现这些命令来引发错误,因为它们的精度超过了实现的精度?

decimals.Decimal('1234.1')
decimals.Decimal('0.123')

2 个答案:

答案 0 :(得分:2)

我在decimal module中找到的最接近的位于context.create_decimal_from_float示例中,使用Inexact context trap

>>> context = Context(prec=5, rounding=ROUND_DOWN)
>>> context.create_decimal_from_float(math.pi)
Decimal('3.1415')
>>> context = Context(prec=5, traps=[Inexact])
>>> context.create_decimal_from_float(math.pi)
Traceback (most recent call last):
    ...
Inexact: None

十进制模块似乎没有规模的概念。它的精度基本上就是你的尺度+精度。

答案 1 :(得分:0)

您总是可以定义更严格的Decimal类,并检查setter和构造函数中的小数位数。这应该与Decimal对象完全相同,除了它在创建或设置超过两位小数时引发ValueError。

class StrictDecimal:
    def __init__(self, x):
        x = Decimal(x)
        if format(x, '.2f') != str(x):
            raise ValueError('Precision must by limited to 2 digits')
        self._x = x

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, x):
        x = Decimal(x)
        if format(x, '.2f') != str(x):
            raise ValueError('Precision must by limited to 2 digits')
        self._x = x