Я немного поигрался с рельсами и нашел кое-что странное. Для хранения денежного значения я использую типичный десятичный тип данных, который активная запись преобразует в BigDecimal. Я посчитал это точным и решил избежать странного поведения математики с плавающей запятой. Но когда я сохраняю 99,99 в БД, все работает нормально, но когда записи загружаются активной записью, она теряет точность и преобразуется во что-то вроде 99,9899999999. Это похоже на проблему с плавающей запятой.
Я сделал несколько тестов и обнаружил, что создание BigDecimal, подобное этому, b = BigDecimal.new("99.99") приводит к "чистой" переменной, но создание ее таким образом b = BigDecimal.new(99.99) приводит к "нечистой" версии которого я хочу избежать.
Я предполагаю, что ActiveRecord реконструирует BigDecimal с промежуточным числом с плавающей запятой при загрузке записи из базы данных. Это не то, чего я хочу, и я хотел бы знать, можно ли этого избежать.
Версия Ruby 1.9.3p0 Rails 3.2.9 Sqlite 3.7.9