如何强制 Ruby 数字表现得像整数,而不是固定数字?

发布于 2024-11-25 12:36:01 字数 791 浏览 1 评论 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 

我希望结果0.25。我怎样才能做到这一点?

是否有必要/可能强制 interim_result.classinteger

请注意,以下内容并未给出所需的 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

谢谢。

I have:

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 

I want result to be 0.25. How can I make this happen?

Is it necessary/possible to force interim_result.class to be integer?

Please note the following doesn't give the desired result of 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

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

倾城花音 2024-12-02 12:36:01

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

Yes, the easiest way would be to call to_f instead of to_i when assigning a value to interim_result.

捂风挽笑 2024-12-02 12:36:01

我不太确定你的意思是表现得像一个整数。如果这是完全正确的,那么小数点后就没有任何内容了;但是,我相信您可以使用 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 > 

I'm not quit sure what you mean behave like an integer. IF that was completely true you would have nothing after a decimal; however, I believe you can use round() to achieve what you want.

 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 > 
渡你暖光 2024-12-02 12:36:01

只是稍微解释一下您的示例中出了什么问题。

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)

Just a litte explanation what's going wrong in your example.

interim_result is correct 256. and the this happens:

256 / 1024 #-> 0

/ with two fixnums (integer) is kind of modula division.
To show it: you get the first value of:

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

Some solutions (I changed your entry values. your 256 / 1028 is not 0.25, but 24.9..... See Codeglots answer):

256 / 1024.0 #-> 0.25

Perhaps Rational is another nice solution:

256 / Rational(1024,1) #-> (1/4)
256 * Rational(1,1024) #-> (1/4)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文