Лучший способ обработки десятичной точки с фиксированной точкой / разрешением в 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.

Другие вопросы по тегам