如何在红宝石中从0.0001计数到1?

Hid*_*din 7 ruby floating-point-precision

我希望从0.0001到1计数,在ruby中有0.0001步.我写了这段代码,但它进入了无限循环.为什么口译员做错了总结.

x = 0.0001
while x != 1.0
  puts x
  x = x + 0.0001
end
Run Code Online (Sandbox Code Playgroud)

这是它给出的前10个值:

0.0001
0.0002
0.00030000000000000003
0.0004
0.0005
0.0006000000000000001
0.0007000000000000001
0.0008000000000000001
0.0009000000000000002
0.0010000000000000002
Run Code Online (Sandbox Code Playgroud)

它应该是0.0001,0.0002,0.0003等......我怎样才能使它工作?谢谢!

gio*_*ele 16

试试这个:

0.0001.step(1, 0.0001).each { |i| puts i }
Run Code Online (Sandbox Code Playgroud)

编辑:您应该使用该Float#step方法,因为它可以保护您免受浮点运算的怪异.Float#step将负责增加值并以浮动方式与限制进行比较.有关更多信息,请查看官方文档Float#step.


gho*_*ppe 2

问题在于,由于二进制存储和操作,Ruby 中的实数无法准确表示。我会这样做

x = 1
while x < 10000
    puts (x/10000).round(4)
    x += 1
end
Run Code Online (Sandbox Code Playgroud)

  • 需要澄清的是,这不仅限于 Ruby,它是一个浮点问题。 (4认同)