当使用digits选项声明字段Float时,回读不一致的数据

时间:2016-02-22 03:57:43

标签: postgresql openerp precision odoo-8 floating

我正在使用Odoo v8并发现了一个有趣的行为。

当我用数字声明Float时:

pension_unit_rate = fields.Float(digits=(16,4))

并放

<field name="pension_unit_rate" widget="progressbar"/>

在其视图定义和输入数据0.06进入记录并保存,数据在postgresql数据库中正确存储为0.06。

但是当我单击“编辑”按钮时,从数据库读回的数据为0.060000000000000005。

我使用pgAdmin并使用简单的代码检查验证了数据库中的数据是否正确(0.06):

    instance.web.form.FieldProgressBar = instance.web.form.AbstractField.extend({    
    template: 'FieldProgressBar',
    render_value: function() {
    this.$el.progressbar({
        value: this.get('value') || 0,
        disabled: this.get("effective_readonly")
    });

    **console.log(this.get('value'))**

    var formatted_value = instance.web.format_value(this.get('value') || 0, { type : 'float' });

    this.$('span').html(formatted_value + '%');

}});

似乎存储在'value'中的数据是0.060000000000000005,这与数据库中存在的数据不一致。

使用数字选项时,这是由数字数据类型引起的吗?有解决方法或修复方法吗?

提前致谢〜

1 个答案:

答案 0 :(得分:0)

找到答案。

问题在于fields.py中Float字段定义中的旧版本convert_to_cache函数。更新代码修复了问题。

    def convert_to_cache(self, value, record, validate=True):
        # apply rounding here, otherwise value in cache may be wrong!
        value = float(value or 0.0)
        if not validate:
            return value
        digits = self.digits
        return float_round(value, precision_digits=digits[1]) if digits else value