为什么Ruby中的除法返回整数而不是十进制值?

Erw*_*inM 245 ruby math floating-point division integer-division

例如:

9 / 5  #=> 1
Run Code Online (Sandbox Code Playgroud)

但我期待1.8.如何获得正确的十进制(非整数)结果?为什么它会回归1

mu *_*ort 340

它正在进行整数除法.您可以使用to_f强制事物进入浮点模式:

9.to_f / 5  #=> 1.8
9 / 5.to_f  #=> 1.8
Run Code Online (Sandbox Code Playgroud)

如果您的值是变量而不是文字,这也适用.将一个值转换为float足以将整个表达式强制转换为浮点算术.

  • @SeanRyan为什么一般只使用Rails而不是Ruby?我不明白为什么(Ruby on)Rails开发人员会像普通的Ruby开发人员那样做这个特定的事情.也许我只是在挑剔语义,大多数人只是看到(Ruby on)Rails和Ruby在这种情况下是同义词. (3认同)
  • 这是比公认的答案更“轨道”的答案。 (2认同)
  • @斯蒂维克。我不知道这是否普遍适用,但在迄今为止我使用过的所有块中,我只需要将其中一个值转换为浮点数。这似乎将所有东西都转换为与其交互的浮点数。 (2认同)

小智 254

它正在进行整数除法.您可以Float通过添加.0以下内容来创建其中一个数字:

9.0 / 5  #=> 1.8
9 / 5.0  #=> 1.8
Run Code Online (Sandbox Code Playgroud)

  • 这有效,但下面的to_f答案似乎更有用.在Ruby中to_f更惯用吗? (7认同)
  • 如果你要分割两个包含整数的变量,例如`a.to_f/b`,`.to_f`答案会更好.如果你真的划分了两个硬编码的整数(这可能很奇怪),那么使用`9.0/5`就可以了. (5认同)

Kon*_*che 167

还有Numeric#fdiv一种方法可以使用:

9.fdiv(5)  #=> 1.8
Run Code Online (Sandbox Code Playgroud)

  • +1很好.一种鲜为人知但有用的方法. (2认同)
  • +1我更喜欢这个..不需要放.0 :) (2认同)
  • 这是我测试过的最快的方法,获得更高性能的唯一方法是将浮点数的操作数相除。我已经在 Ruby 中构建了一个素数生成器来学习语法,现在我正在优化它以了解什么最有效。下面是我放在一起基准:需要 '的base64';要求 'zlib的';看跌期权Zlib.inflate(Base64.decode64( “eJxlkMEOwiAQRO98hekFuGzxQEwPXvwR01ZqiYHqBk2Tln8XDlWgnDbM25nJonq9NaoD7ZTtR9PigxK09zM7AkgRHieXTYHOsBNf1nklM6B6TuhYpdp + rPgSdiCOi / d / kQ71QBOtAVFLEDly05 + UYQ2H + MckL6z0zioDdJG1S9K1K4iQAW66DhnmiqRYKEJFXMByux + XuOJ2XdO60dKsjC7aBtyTL5O5hLk =”)) (2认同)

Ren*_*aud 39

你可以用irb检查它:

$ irb
>> 2 / 3
=> 0
>> 2.to_f / 3
=> 0.666666666666667
>> 2 / 3.to_f
=> 0.666666666666667
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢IRB风格的答案.他们的信息更丰富. (8认同)

Rok*_*alj 26

您可以包含ruby mathn模块.

require 'mathn'
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您将能够正常进行划分.

1/2              #=> (1/2)
(1/2) ** 3       #=> (1/8)
1/3*3            #=> 1
Math.sin(1/2)    #=> 0.479425538604203
Run Code Online (Sandbox Code Playgroud)

这样,您就可以获得精确的除法(类Rational),直到您决定应用不能表示为有理的操作为止Math.sin.

  • 自 ruby​​ 2.2 起不推荐使用 mathn 模块 (3认同)

Tyl*_*ves 11

更改55.0.你得到整数除法.


ucp*_*uzz 5

这里没有提到Fixnum#to_r,它是从ruby 1.9开始引入的。它将Fixnum转换为有理形式。以下是其用法示例。只要使用的所有数字均为Fixnum,这也可以给出精确的除法。

 a = 1.to_r  #=> (1/1) 
 a = 10.to_r #=> (10/1) 
 a = a / 3   #=> (10/3) 
 a = a * 3   #=> (10/1) 
 a.to_f      #=> 10.0
Run Code Online (Sandbox Code Playgroud)

以有理数运算的浮点数会将结果隐蔽为浮点数的示例。

a = 5.to_r   #=> (5/1) 
a = a * 5.0  #=> 25.0 
Run Code Online (Sandbox Code Playgroud)