我有:
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
感谢。
答案 0 :(得分:3)
是的,最简单的方法是在为to_f
分配值时调用to_i
而不是interim_result
。
答案 1 :(得分: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 >
答案 2 :(得分:0)
只是一个小小的解释,你的例子中出了什么问题。
interim_result是正确的256.这发生了:
256 / 1024 #-> 0
/有两个fixnums(整数)是一种模块划分。 要显示它:你得到第一个值:
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)