Лучший способ обработки десятичной точки с фиксированной точкой / разрешением в Ruby on Rails - PullRequest
1 голос
/ 14 июня 2011

Итак, я создаю приложение для отслеживания времени с использованием Ruby On Rails и сохраняю время как число, представляющее часы.

Поскольку значение, превышающее 0,01 (36 секунд) часов, не имеет значения, мне нужно только 2 десятичных знака.

Я использую базу данных MySQL с плавающей точкой в ​​качестве типа столбца. Хотя это работает большую часть времени, время от времени я получаю сообщение об ошибке при вычислении и округлении чисел.

Я провел некоторые исследования своих вариантов и вижу, что многие люди рекомендуют использовать BigDecimal. Поскольку я использую множество пользовательских запросов к базе данных с использованием вычислений, я хотел знать, как это повлияет на изменение типа столбца. Хранит ли он это как строку или yaml, или это изначально поддерживается MySQL?

Или есть эквивалентный способ сделать десятичную арифметику с фиксированной точкой в ​​Ruby / Rails.

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

Любое понимание приветствуется.

Ответы [ 3 ]

3 голосов
/ 14 июня 2011

Вместо сохранения времени в виде числа, представляющего часы, сохраните его в виде числа, представляющего приращения 36 секунд (или, возможно, отдельных секунд).

Вам не требуется десятичный вспомогательный тип для выполнения фиксированныхпросто разделите на бизнес-логику, чтобы получить часы.

2 голосов
/ 14 июня 2011

MySQL имеет встроенную поддержку BigDecimal.http://dev.mysql.com/doc/refman/5.1/en/precision-math-decimal-changes.html

Я бы предложил использовать это;это хорошо работает в моих приложениях Rails.Разрешение этой базе данных обрабатывать это вместо приложения облегчает жизнь - вы используете абстракции так, как они спроектированы.

Вот код миграции:

change_column :table_name, :column_name, :decimal

1009 * Перемещение Rails для столбца изменений

1 голос
/ 14 июня 2011

На самом деле мы создали приложение для отслеживания времени (http://www.yanomo.com)) и храним все наше время как количество часов, которое они представляют с MySQL в качестве базовых dbms. Для типа столбца мы используем DECIMAL (точность, масштаб). В вашем случае подойдет что-то вроде DECIMAL (5,2). В нашем businesslogic (JAVA) мы используем BigDecimal.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...