Най-добрият начин за работа с десетичен знак с фиксирана точка/percision в Ruby on Rails

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

Тъй като всичко над 0,01 (36 секунди) часа е без значение, имам нужда само от 2 знака след десетичната запетая.

Използвам MySQL база данни с float като тип колона. Въпреки че това работи през повечето време, от време на време получавам грешка при изчисляването и закръглянето на плаващите стойности.

Направих известно проучване на моите възможности и виждам, че много хора препоръчват използването на BigDecimal. Тъй като използвам много персонализирани заявки към бази данни, използвайки изчисления, исках да знам как промяната на типа на колоната ще повлияе на това. Съхранява ли това като низ или yaml, или се поддържа първоначално от MySQL?

Или има еквивалентен начин за извършване на десетична аритметика с фиксирана запетая в Ruby / Rails.

Предполагам, че всеки метод ще изисква много рефакторинг, как мога да избегна това най-много?

Всяко прозрение се оценява.


person loosecannon    schedule 14.06.2011    source източник


Отговори (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 за колона за промяна

person Polemarch    schedule 14.06.2011
comment
+ , :precision=> 5, :scale => 2 към колоната за промяна - person loosecannon; 14.06.2011
comment
Това работи почти безпроблемно, трябваше да променя почти не кода на приложението. - person loosecannon; 15.06.2011

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

Не трябва да имате нужда от десетичен поддържащ тип, за да правите фиксирана точка, просто разделете в бизнес логиката, за да получите часове.

person τεκ    schedule 14.06.2011

Всъщност създадохме приложение за проследяване на времето (http://www.yanomo.com) и съхраняваме цялото си време като броят часове, които те представляват с MySQL като основни dbms. За типа колона използваме DECIMAL(прецизност,мащаб). Във вашия случай нещо като DECIMAL(5,2) би свършило работа. В нашата бизнеслогика (JAVA) използваме BigDecimal.

person joostschouten    schedule 14.06.2011