首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >精度舍入必须为正

精度舍入必须为正
EN

Stack Overflow用户
提问于 2021-07-15 15:45:06
回答 1查看 113关注 0票数 2

所以我想把我的代码从Odoo12转换成Odoo13,我被这部分卡住了:

代码语言:javascript
复制
#digits_rounding_precision here is 0.0
digits_rounding_precision = self.currency_id.rounding
        if float_is_zero(self.residual_amount, precision_rounding=digits_rounding_precision):
            self.reconciled = True
        else:
            self.reconciled = False

我得到了这种类型的错误:

代码语言:javascript
复制
precision_rounding must be positive, got %s" % precision_rounding
AssertionError: precision_rounding must be positive, got 0.0

但是在Odoo12上,值为0.0就可以了,请帮帮我

EN

回答 1

Stack Overflow用户

发布于 2021-07-15 17:23:03

在看了Odoo的源代码后,我发现了这个(在Odoo 13.0及更高版本中):

https://github.com/odoo/odoo/blob/13.0/odoo/tools/float_utils.py#L25

代码语言:javascript
复制
def _float_check_precision(precision_digits=None, precision_rounding=None):
    assert (precision_digits is not None or precision_rounding is not None) and \
        not (precision_digits and precision_rounding),\
         "exactly one of precision_digits and precision_rounding must be specified"
    assert precision_rounding is None or precision_rounding > 0,\
         "precision_rounding must be positive, got %s" % precision_rounding
    if precision_digits is not None:
        return 10 ** -precision_digits
    return precision_rounding

而在Odoo 12.0中是这样的:

代码语言:javascript
复制
def _float_check_precision(precision_digits=None, precision_rounding=None):
    assert (precision_digits is not None or precision_rounding is not None) and \
        not (precision_digits and precision_rounding),\
         "exactly one of precision_digits and precision_rounding must be specified"
    if precision_digits is not None:
        return 10 ** -precision_digits
    return precision_rounding

所以看起来他们添加了额外的条件,precision_rounding不能再等于零了-所以你必须指定正数。

简单的解决方法是向它添加一个小数字,以确保它是正数。像0.01这样的东西应该没问题,因为Odoo声明precision_rounding可以是浮动的。

代码语言:javascript
复制
"""
       :param int precision_digits: number of fractional digits to round to.
       :param float precision_rounding: decimal number representing the minimum
           non-zero value at the desired precision (for example, 0.01 for a 
           2-digit precision).
       :param float value: value to compare with the precision's zero
       :return: True if ``value`` is considered zero
"""
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68389829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档