Лучший способ обработки десятичной точки с фиксированной точкой / разрешением в Ruby on Rails
Поэтому я создаю приложение для отслеживания времени с использованием Ruby On Rails и сохраняю время как число, представляющее часы.
Поскольку значение, превышающее 0,01 (36 секунд) часов, не имеет значения, мне нужно только 2 десятичных знака.
Я использую базу данных MySQL с плавающей точкой в качестве типа столбца. Хотя это работает большую часть времени, время от времени я получаю сообщение об ошибке с вычислением и округлением чисел с плавающей точкой.
Я провел некоторые исследования своих вариантов и вижу, что многие люди рекомендуют использовать BigDecimal. Поскольку я использую множество пользовательских запросов к базе данных с использованием вычислений, я хотел знать, как это повлияет на изменение типа столбца. Хранит ли он это как строку или yaml, или это изначально поддерживается MySQL?
Или есть эквивалентный способ сделать десятичную арифметику с фиксированной точкой в Ruby / Rails.
Я предполагаю, что любой метод потребует большого количества рефакторинга, как я могу избежать этого больше всего?
Любое понимание приветствуется.
3 ответа
MySQL имеет встроенную поддержку BigDecimal. http://dev.mysql.com/doc/refman/5.1/en/precision-math-decimal-changes.html
Я бы предложил использовать это; это хорошо работает в моих приложениях Rails. Разрешение этой базе данных обрабатывать это вместо приложения облегчает жизнь - вы используете абстракции так, как они спроектированы.
Вот код миграции:
change_column :table_name, :column_name, :decimal
Справка: миграция Rails для столбца изменений
Вместо сохранения времени в виде числа, представляющего часы, сохраните его в виде числа, представляющего приращения 36 секунд (или, возможно, отдельных секунд).
Вам не нужен десятичный тип поддержки для фиксированной точки, просто разделите бизнес-логику, чтобы получить часы.
На самом деле мы создали приложение для отслеживания времени ( http://www.yanomo.com/) и храним все наше время как количество часов, которое они представляют с MySQL в качестве базовой базы данных. Для типа столбца мы используем DECIMAL(точность, масштаб). В вашем случае подойдет что-то вроде DECIMAL(5,2). В нашем businesslogic (JAVA) мы используем BigDecimal.