如何在ruby中从0.0001计数到1?

如何在ruby中从0.0001计数到1?,ruby,floating-point-precision,Ruby,Floating Point Precision,我想用ruby中的0.0001步数从0.0001数到1。 我写了这段代码,但它进入了一个无限循环。解释为什么口译员做了错误的求和 x = 0.0001 while x != 1.0 puts x x = x + 0.0001 end 以下是它给出的前10个值: 0.0001 0.0002 0.00030000000000000003 0.0004 0.0005 0.0006000000000000001 0.0007000000000000001 0.00080000000000000

我想用ruby中的0.0001步数从0.0001数到1。 我写了这段代码,但它进入了一个无限循环。解释为什么口译员做了错误的求和

x = 0.0001
while x != 1.0
  puts x
  x = x + 0.0001
end
以下是它给出的前10个值:

0.0001
0.0002
0.00030000000000000003
0.0004
0.0005
0.0006000000000000001
0.0007000000000000001
0.0008000000000000001
0.0009000000000000002
0.0010000000000000002
它应该是0.0001、0.0002、0.0003等。。。 我怎样才能让它工作?
谢谢

而不是
x!=1.0
,put
x<1.0
。这至少可以确保循环结束

像那些运行我们所有现代计算机的二进制系统不能(很容易)表示分数,特别是不能准确地用十进制表示的分数。这就是当你应该有
.0003
时奇怪数字出现的地方。它是数字如何在内部表示的人工制品

有些语言比其他语言更擅长处理数字和准确性,因此,如果数字的准确性很重要,您需要使用不同的语言,使用一个为您处理数字的库(有效数字等),或者您需要自己进行适当的四舍五入处理,等等。在每一步中。

尝试以下方法:

0.0001.step(1, 0.0001).each { |i| puts i }

EDIT:您应该使用
Float#step
方法,因为它可以避免使用奇怪的浮点运算<代码>浮动#步骤将负责增加值,并以防浮动的方式与限制进行比较。有关更多信息,请查看。

问题在于,由于二进制存储和操作,ruby中的实数不能准确表示。我会这么做

x = 1
while x < 10000
    puts (x/10000).round(4)
    x += 1
end
x=1
而x<10000
卖出(x/10000)。第四轮(4)
x+=1
结束

浮点数并不精确


如果必须使用干净的x,我建议在使用该值之前使用整数并除以1000。如果您不在乎关闭的一点点噪音,您可以更改while x!=从1.0到x<1.0

您看到的是浮点数的二进制表示。这会影响所有计算机编程语言。有关更多详细信息,请参阅

您可以在打印时将其四舍五入到适当的位数,或者如goiele所发现的,使用
步骤

0.0001.step(1, 0.0001).each do |i|
  puts i
end

是的,它正在工作。但是如果我想要一个准确的结果怎么办?为什么0.0005+0.0001等于ruby的0.00060000000001呢?因为浮点数的工作方式:看看我同意。一般来说,在运算中使用整数(如果可能的话),然后在最后进行向下转换,将得到更准确的结果。浮点数的常见二进制表示法(例如IEEE 754)并不准确。Michael,你是说数学是可靠的,但输出是问题所在吗?有趣的是,jruby上不会出现这种情况。Giole的答案显然比您标记为正确的答案要好。谢谢!这使得工作:)谢谢你!我会把它通读一遍!代码也运行良好:)谢谢!:)我刚开始编程。我不知道!:)澄清一下,这不仅仅限于Ruby,而是一个浮点问题。
1.step(10000, 1).each { |x| puts "%f" % (x / 10000.0).round(4) }