【问题标题】:Generate a Random Decimal within a range in Ruby/Rails or Faker在 Ruby/Rails 或 Faker 中生成一个范围内的随机小数
【发布时间】:2020-06-06 09:17:36
【问题描述】:

Faker 有没有办法生成 0-1 之间的随机小数? https://github.com/faker-ruby/faker/issues/1834

Faker::Number.decimal(l_digits= 2, r_digits= 2).within(range: 0..1) 

以上行不通。错误:

 undefined method `within' for "12.4" String  

12.4 是生成的随机数

如果我不能使用 faker,Ruby 有没有办法生成这个?我只需要生成一个在 0 到 1 之间有 2 位小数的数字

【问题讨论】:

  • “不起作用”是什么意思?预期结果,实际结果?
  • @Pascal 更新了问题
  • 似乎decimal 返回一个字符串,您尝试对其调用within 方法。这个方法从何而来?
  • @Pascal 的 inside 方法来自 Faker 库

标签: ruby-on-rails ruby faker


【解决方案1】:

您可以尝试以下方法:

Faker::Number.between(from: 0.0, to: 1.0).round(2)

来源:

【讨论】:

    【解决方案2】:

    试试:

    rand.round(2)
    

    rand 生成一个随机数,round 将其四舍五入为所需的小数位数。这可能会生成一个少于两位十进制数字的数字(例如0.5)。 如果您想强制执行此操作,您可以将随机数格式化为字符串:

    Kernel.format("%.2f", rand)
    

    %ffloat 格式,%.2f 特定于两位十进制数字。 您实际上可以省略 Kernel 并调用 format 或使用 %,如下所示:

    "%.2f" % rand
    

    (我更喜欢Kernel.format,对我来说似乎更易读)

    现在这又带来了另一个问题:

    pattern = "%.2f"
    Kernel.format(pattern, 0) # => "0.00"
    Kernel.format(pattern, 0.9999999) # => "1.00"
    

    因为当格式化数字突然不小于1 时,它会被四舍五入。如果您之间的意思是不包括 1,您将需要对其进行更多调整:

    Kernel.format(pattern, 0.floor(2)) # => "0.00"
    Kernel.format(pattern, 0.9999999.floor(2)) # => "0.99"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-08
      • 1970-01-01
      • 2011-08-02
      • 2011-08-26
      • 2010-12-24
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多