2016-02-22 6 views
0

Я использую Odoo v8 и обнаружил интересное поведение.Непоследовательные данные считываются, когда поле Float объявляется с цифрами.

Когда я объявить Float с цифрами:

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

и положить

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

в своих данных 0,06 определение представления и ввода в записи и сохранить данные хранятся правильно, как 0,06 в postgresql.

Но когда я нажимаю кнопку «Изменить», данные, возвращаемые из базы данных, составляют 0.060000000000000005.

Я проверил, что данные в базе данных правильно (0,06) с использованием pgAdmin и простой проверке кода:

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 + '%'); 

}}); 

Похоже, что данные, хранящиеся в «значение» является +0,060000000000000005, который не согласуется с существующими данными в база данных.

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

Заранее благодарен

+0

Если вы хотите точные цифры, вы не должны использовать 'float' в первую очередь: http://floating-point-gui.de/ –

ответ

0

Найден ответ.

Проблема связана со старой версией функции convert_to_cache в определении поля Float в fields.py. Обновление кода исправило проблему.

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