【问题标题】:How do I always round a number down in Ruby?我如何总是在 Ruby 中四舍五入?
【发布时间】:2017-12-26 20:48:22
【问题描述】:

例如,如果我希望 987 等于“900”。

【问题讨论】:

  • 欢迎来到 SO。我建议阅读 stackoverflow.com/help/how-to-ask。它将帮助您编写可靠的问题,从而产生(希望)好的答案。你想让数字四舍五入成为一个字符串吗?
  • 您好,感谢您的热烈欢迎!实际上,我希望它是一个数字。

标签: ruby numbers integer fixnum


【解决方案1】:

您可以使用对数来计算除以的最佳倍数。

  def round_down(n)
    log = Math::log10(n)
    multip = 10 ** log.to_i
    return (n / multip).to_i * multip 
  end

  [4, 9, 19, 59, 101, 201, 1500, 102000].each { |x|
     rounded = round_down(x)
     puts "#{x} -> #{rounded}"
  }

结果:

4 -> 4
9 -> 9
19 -> 10
59 -> 50
101 -> 100
201 -> 200
1500 -> 1000
102000 -> 100000

当您需要计算图形的偶数刻度间距时,此技巧非常方便。

【讨论】:

    【解决方案2】:
    n = 987
    m = 2
    
    n.floor(-m)
      #=> 900
    

    参见Integer#floor:“当精度为负时,返回值是一个至少有ndigits.abs 尾随零的整数。”

    或

    (n / 10**m) * 10**m
      #=> 900
    

    【讨论】:

    • n.round(-m) 给了我 1,000 而不是 900。可以使用 n.floor(-m) 更好地处理“总是下降”的负数
    • @SimpleLime,是的,我注意到n.round(m),所以回滚到我原来的答案。我会添加你的建议。谢谢。
    • 不知道您可以将否定传递给这些方法,直到我看到您的方法并且您现在已经来回讨论了一些变体,所以会觉得不诚实发布我自己的答案,更正您答案的某些编辑历史记录中的小细节
    • 这太棒了!谢谢所有提供答案的人:)
    猜你喜欢
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2011-12-04
    • 2023-01-12
    • 2016-09-07
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    相关资源
    最近更新 更多