То, что вы делаете, называется целочисленным делением, которое отбрасывает любой остаток, так как оно не может быть выражено в целых числах, например:
1 / 3 # == 0
Как уже упоминали другие респонденты, вы можете вызвать плавающее числоточка деления.Вы должны заставить первый аргумент быть float (1 здесь), вызывая .to_f.Второй аргумент будет автоматически преобразован в число с плавающей точкой, например:
1.to_f / 3 # ~ 0.3333...
Обратите внимание, что после перехода к числам с плавающей точкой результат, вообще говоря, больше не является точным.Вот почему я поставил ~ 0,333.
Точные детали более сложны.Я полагаю, что в двоичной арифметике с плавающей запятой, которая является обычной в современных микропроцессорах, степени 2 все еще точны.Но целое число 3, например, больше не представляется точно, а только в пределах точности представления с плавающей запятой (обычно 1E-16 или около того для «двойной» точности).
Короче говоря, здесьпрактическое правило: если вы имеете дело с денежными значениями, где точность имеет значение (когда-либо замечалось расхождение в 1 цент в телефонном счете?), не храните вычисленные результаты и не храните значения в плавающих точках.Вместо этого используйте целочисленные или десятичные типы данных (которые внутренне хранят строки).Вычислять результаты с плавающей запятой только для отображения и по запросу, если это возможно.Избегайте добавления больших и малых значений вместе, как только они являются плавающими, и избегайте цепных вычислений в плавающих.Переработайте свою алгебру, чтобы избежать делений до конца.Ruby также поддерживает тип данных Rational, который точно представляет дроби и может быть полезен.
Эти проблемы относятся к науке о «распространении ошибок с плавающей запятой», в которой вы можете найти дополнительную информацию, если вам нужно.