【问题标题】:Why does my division operator keep returning a zero? [duplicate]为什么我的除法运算符一直返回零? [复制]
【发布时间】:2018-05-17 18:24:43
【问题描述】:

当我打印“机会”的结果时,它一直返回值“0”。我不确定它是否与我使用 rand 运算符有关。我该如何解决这个问题,以便它返回实际值而不是 0?

    p1Health = rand(50..100).to_i
    p1Attack = rand(25..50).to_i
    p1Overall = (p1Health + p1Attack).to_i

    p2Health = rand(50..100).to_i
    p2Attack = rand(25..50).to_i
    p2Overall = (p2Health + p2Attack).to_i

    p1p2 = p1Overall + p2Overall

    chances = p1Overall / (p1Overall + p2Overall)

【问题讨论】:

  • 请记住,在 Ruby 中,大写字母具有特定含义,因此变量和方法名称只能小写。考虑使用像 p1_health 这样的名称,或者更好的是 player[0][:health],在这里使用适当的数据结构。

标签: ruby random division


【解决方案1】:

在计算chances 时,您正在进行整数除法,这将返回向下舍入到最接近整数的结果。在这种情况下,您会看到0,因为您的结果是一个百分比(因为它小于 1,所以它在整数除法中向下舍入为 0)。

要返回实际值,您需要将其中一个整数转换为 Float,如下所示:

chances = p1Overall / (p1Overall + p2Overall).to_f

希望这会有所帮助!

【讨论】:

  • 成功了,谢谢!
  • 还有鲜为人知/很少使用/经常被忽视的fdiv,例如p1overall.fdiv(p1overall + p2overall)
【解决方案2】:

在 Ruby 中,整数除以整数会产生整数结果。那就是:

1 / 2
# => 0

0 是最接近的整数答案。不同的是:

5 / 2
# => 2

基本上是 2.5 向下舍入到 2。

如果你想要一个浮点结果:

chances = p1overall.to_f / (p1overall + p2overall)

.to_f 首先转换为浮点数。这会产生一个浮点答案。

【讨论】:

    【解决方案3】:

    在大多数语言中(c、c++、java、ruby、python ..etc)integer/integer 产生integer 结果。 您必须使用至少一个值作为浮点数。

    这是许多语言使用的基本约定:

    操作执行于:

    integer + integer => integer
    integer - integer => integer
    integer / integer => integer
    integer * integer => integer  
    float + integer => float
    integer + float => float
    float / integer => float
    integer / float => float
    

    【讨论】:

    • 在 Smalltalk 中,1/3 返回 (1/3),即 Fraction 的实例,Ruby 的 Rational 的挂件。
    • 感谢@Stefan 纠正我,已更新帖子plus one
    猜你喜欢
    • 1970-01-01
    • 2017-11-03
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 2017-11-24
    相关资源
    最近更新 更多