2011-02-09 3 views
2

Я определил десятичное поле со шкалой/значащими цифрами 4 в mysql (например, 10.0001). ActiveRecord возвращает его как BigDecimal.Как обеспечить количество значащих цифр BigDecimal

Я могу установить поле в ActiveRecord со шкалой 5 (например, 10.00001) и сохранить его, что эффективно усекает значение (оно хранится как 10.0000).

Есть ли способ предотвратить это? Я уже посмотрел на класс BigDecimal, если есть способ заставить масштаб. Не удалось найти. Я могу рассчитать масштаб BigDecimal и вернуть ошибку проверки, но мне интересно, есть ли более эффективный способ ее принудительного применения.

ответ

1

Вы можете добавить before_save обработчик для класса и включают в себя логику раунда по вашему выбору, например:

class MyRecord < ActiveRecord::Base 
    SCALE = 4 
    before_save :round_decimal_field 
    def round_decimal_field 
    self.decimal_field.round(SCALE, BigDecimal::ROUND_UP) 
    end 
end 
r = MyRecord.new(:decimal_field => 10.00009) 
r.save! 
r.decimal_field # => 10.0001 

Масштабный коэффициент может быть даже назначаемый автоматически при чтении схемы каким-то образом.

См. Имена констант в Ruby BigDecimal для других режимов округления.

Смежные вопросы