Как заставить числа в Ruby вести себя как целые числа, а не как фиксированные числа? - PullRequest
0 голосов
/ 19 июля 2011

у меня есть:

steven$ irb
ruby-1.9.2-p180 :001 > foo = "256MB"
 => "256MB" 
ruby-1.9.2-p180 :002 > interim_result = foo.slice(/\d+/).to_i
 => 256 
ruby-1.9.2-p180 :003 > interim_result.class
 => Fixnum 
ruby-1.9.2-p180 :004 > result = interim_result/1028
 => 0 

Я хочу, чтобы result было 0.25. Как я могу это сделать?

Необходимо / возможно ли заставить interim_result.class быть integer?

Обратите внимание, что следующее не дает желаемого результата 0,25:

ruby-1.9.2-p180 :002 > interim_result = foo.slice(/\d+/).to_f
 => 256.0 
ruby-1.9.2-p180 :003 > result = interim_result/1028
 => 0.2490272373540856 
ruby-1.9.2-p180 :004 > result.round_to(2)
NoMethodError: undefined method `round_to' for 0.2490272373540856:Float

Спасибо.

Ответы [ 3 ]

3 голосов
/ 19 июля 2011

Да, самым простым способом было бы вызвать to_f вместо to_i при присвоении значения interim_result.

0 голосов
/ 19 июля 2011

Просто краткое объяснение того, что идет не так в вашем примере.

interim_result является правильным 256. и это происходит:

256 / 1024 #-> 0

/ с двумя фикснумами (целое число) является своего рода модулемразделение.Чтобы показать это: вы получаете первое значение:

256.divmod(1024)#-> [0, 256]
256.divmod(1024).first #-> 0

Некоторые решения (я изменил ваши входные значения. Ваши 256/1028 не 0,25, а 24,9 ..... См. Ответ Codeglots):

256 / 1024.0 #-> 0.25

Возможно, Rational - еще одно приятное решение:

256 / Rational(1024,1) #-> (1/4)
256 * Rational(1,1024) #-> (1/4)
0 голосов
/ 19 июля 2011

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

 ruby-1.9.2-p180-mri :001 > a = 0.2490272373540856 
 => 0.2490272373540856 
 ruby-1.9.2-p180-mri :002 > a.round(2)
 => 0.25 
 ruby-1.9.2-p180-mri :003 > 
...