Десятичные значения отображаются неправильно

Я совершенно новичок в рельсах, и у меня есть небольшой вопрос о том, что некоторые десятичные значения из моей базы данных отображаются как слегка отличающиеся на очень небольшую величину в выходных данных индекса/показа скаффолдинга по умолчанию в браузере. У меня есть элемент, в котором конкретное значение атрибута равно 9,12, и я могу подтвердить, что оно правильно хранится в моей базе данных sqlite3 в виде десятичного числа. Однако на индексной странице или странице показа элемента это дает мне 9.1199999999999999

Просто чтобы еще больше запутать, если я попытаюсь отредактировать элемент, форма покажет точное значение 9,12 в соответствующем поле.

Немного поигравшись, я вижу, что другие значения (например, 9,11, 9,13, 9,14, 9,123) дадут мне аналогичные ошибки точности в выводе html, в то время как многие другие (например, 9,1, 9,09, 9,15, 9,121) будут отображаться как они должен.

Теперь я понимаю, что такое поведение ожидается при использовании значений с плавающей запятой из-за того, как они хранятся в двоичном формате, но я понимаю, что у десятичного числа не должно быть таких причуд, связанных с точностью. Если это правда, то все, что я могу предположить, это то, что проблема связана с Rails. Так может ли кто-нибудь просветить меня о том, что вызывает такое поведение?

Очевидно, я могу обновить свое представление, чтобы оно отображалось правильно:

<%= number_with_precision(item.value, precision: 2) %>

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

Между прочим, я использую Rails 4.0.0beta1 с Ruby 2.0.0 (чтобы следовать последнему изданию книги Agile Web Development with Rails). Мне было бы интересно узнать, происходит ли то же самое в Rails 3.2.

Редактировать: по иронии судьбы все отображается правильно, если я обновляю базу данных, чтобы вместо этого использовать тип с плавающей запятой.


person Inkling    schedule 13.04.2013    source источник
comment
у десятичной дроби не должно быть таких причуд, связанных с точностью. Почему?   -  person sawa    schedule 13.04.2013
comment
Такое впечатление у меня сложилось из здесь, а также из других ссылок по этому вопросу.   -  person Inkling    schedule 13.04.2013


Ответы (2)


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

person Sudhir Jonathan    schedule 13.04.2013

Я задавал этот вопрос давно, но, если я правильно помню, это была просто ошибка в бета-версии Rails, и в финальной версии Rails 4 она вел себя так, как ожидалось.

person Inkling    schedule 20.03.2015