0

我有:

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

谢谢。

4

3 回答 3

3

是的,最简单的方法是调用to_f而不是to_i在为interim_result.

于 2011-07-19T11:44:36.603 回答
0

我不确定你的意思是什么表现得像一个整数。如果这完全正确,那么小数点后您将一无所有;但是,我相信你可以用它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 > 
于 2011-07-19T11:54:34.193 回答
0

只是一个小小的解释你的例子出了什么问题。

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)
于 2011-07-19T14:27:11.267 回答