Ошибка округления значений с использованием .round в Ruby

Следующий фрагмент кода отлично работает в скрипте/консоли, но возвращает следующую ошибку, когда я компилирую то же самое в скрипте ruby:

:in `round': wrong number of arguments (1 for 0) (ArgumentError)

tf={"ph"=>{0=>1.33333333333333, 1=>1.5}, "fee"=>{0=>1.66666666666667}, "test"=>{0=>1.16666666666667, 1=>1.25}, "what"=>{0=>2.0, 1=>2.0}, "for"=>{0=>1.5}, "is"=>{0=>1.83333333333333, 1=>1.75}}

tf.each{|k,v| v.each{|k1,v1| tf[k][k1]=(v1.round(5))}}

Любые идеи ? Ваше здоровье !


person Shreyas    schedule 01.05.2010    source источник


Ответы (2)


Float#round работает по-разному в Ruby 1.8 и Ruby 1.9: в 1.8 жалуется на данный аргумент, в 1.9 возвращает обратно float должным образом округлены до заданного числа десятичных знаков.

Но, как указано в статье на другой ответ мудро говорит:

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

person Mladen Jablanović    schedule 01.05.2010

Судя по тому, как это выглядит, вы не должны передавать аргумент методу round. Вы прошли 5 к нему.
Если вы пытаетесь округлить до 5 знаков после запятой, для этого нет встроенного метода (о котором я знаю). На этой странице объясняется, как это сделать: http://solutions.hans-eric.com/rounding-off-floating-point-numbers-in-ruby

person bennybdbc    schedule 01.05.2010
comment
Мне нужно округлить каждое число до 5 знаков после запятой. И что интересно, тот же самый кусок кода РАБОТАЕТ в консоли! - person Shreyas; 01.05.2010
comment
Это интересно. Я отредактировал, чтобы включить ссылку, которая поможет вам. - person bennybdbc; 01.05.2010