Точность числа в рубине с простой арифметикой - PullRequest
0 голосов
/ 24 марта 2011

Я изучаю Ruby для удовольствия, а также для создания веб-сайтов (но это не имеет значения).Играя с ним, я заметил нечто «странное»

Когда я вычисляю 4,21 + 5 с помощью irb, он отвечает на 9,21 (странно, верно?)

, когда я вычисляю 4,23 + 5, это дает9,23 (вау, это определенно странно).

и когда я набираю 4,22 + 5, он отвечает на 9,21999 ... (ш ... подожди! Это действительно странно).

Отсюда мой вопрос: в чем дело?Я бы понял это поведение с делением или действительно большими числами, но в этом простом случае .... ???

Значит ли это, что я не могу разработать бухгалтерское приложение с Ruby?Есть ли патч или что-то, что нужно применить?(к моему мозгу, скорее всего)

Ответы [ 2 ]

5 голосов
/ 24 марта 2011

Вы должны прочитать о представлении с плавающей точкой в ​​компьютерах. Это руководство - хорошее место для начала. Вот суть этого:

Потому что внутренне компьютеры используют формат (двоичная с плавающей точкой), что не может точно представить число например, 0,1, 0,2 или 0,3.

Когда код скомпилирован или интерпретируется, ваш «0,1» уже округляется до ближайшего числа в этом формат, в результате чего небольшой ошибка округления еще до расчет происходит.

Кстати, я не уверен, почему вы думаете, что 4.21 + 5 = 9.21 или 4.23 + 5 = 9.23 странно. Если вы думаете, что это странно, потому что один литерал - это целое число, а другой - число с плавающей точкой, которое заканчивается как ответ с плавающей точкой, вот как Ruby и некоторые другие языки обрабатывают различия в числовых типах. Было бы не удобно, если бы Ruby снизил точность вашего числа с плавающей точкой и вернул вам целое число назад (9), поэтому любые целочисленные литералы эффективно заменяются на числа с плавающей точкой.

Что касается использования чисел с плавающей запятой в финансовом приложении, посмотрите Разработка финансового приложения . Основным выводом является использование десятичного объекта против Float.

1 голос
/ 24 марта 2011

http://ruby -decimal.rubyforge.org /

Это пакет, который вы хотели бы сделать с надежной математикой с плавающей точкой в ​​ruby. Ссылка Developint Financial Applications не ссылается на нее, но она делает важный момент использования десятичных типов данных в вашей базе данных.

Просто отмечу это, так как для меня это было неочевидно:)

...