Ruby ruby 如何迭代小数,已经指定精度迭代

ptmagic · 2012年07月25日 · 最后由 torvaldsdb 回复于 2017年02月15日 · 4274 次阅读

各位大大,请问如何在 ruby 中指定精度来进行迭代小数呢?

乘一个倍数?

#1 楼 @Rei 那正常的迭代,类似于迭代出 1.0 1.1 1.2 1.3.....10.0 这样的指定好小数点后 1 位的迭代呢?

#2 楼 @ptmagic 像#1 说的就行啊 (10..100).each{|n| n/10}

或者重写 succ 方法?

#3 楼 @jjym 用您的代码 (1..10).each{|n| print n/10} 打印出来是 0000000001,我想要的是 打印出来 1.0 1.1 1.2...10.0

google 了一下

(0..10).step(0.5)

稍微修改一下是你要的结吧 (0..10).step(0.1).map { |i| "%.1f" % i }

#6 楼 @fresh_fish (1..10).step(0.1){|i| print i,""} 请问这样的输出结果为什么是

1.01.11.21.31.41.51.61.71.81.90000000000000012.02.12.22.30000000000000032.42.52.62.72.80000000000000032.93.03.13.23.30000000000000033.40000000000000043.53.63.73.80000000000000033.90000000000000044.04.10000000000000054.24.34.44.54.60000000000000054.74.84.95.05.10000000000000055.25.35.45.55.60000000000000055.75.8000000000000015.96.06.10000000000000056.26.3000000000000016.46.56.60000000000000056.76.8000000000000016.97.07.10000000000000057.27.3000000000000017.47.57.60000000000000057.77.8000000000000017.98.08.18.2000000000000018.38.48.58.68.7000000000000018.88.99.09.19.2000000000000019.39.49.59.69.7000000000000019.89.910.0=> 1..10

#6 楼 @fresh_fish 为什么会出现 1.900000000000000 这样的数字呢?

#8 楼 @ptmagic 0.4 -0.3 一样的问题,说是二进制的圆整问题...

#9 楼 @fresh_fish 谢谢您的耐心回复哈

#4 楼 @ptmagic 好吧我 SB 了 用 bigdecimal 吧

require 'bigdecimal'
require 'bigdecimal/util'
(0..10).step(0.1.to_d).map{|i|i.to_f}

#11 楼 @jjym 别这么说,你也同样给予我帮助了,谢谢

irb(main):003:0> (1..10).step(0.1){|i| print i,' '}
1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1
3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5.0 5.1 5.2 5.3
5.4 5.5 5.6 5.7 5.8 5.9 6.0 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 7.0 7.1 7.2 7.3 7.4 7.5
7.6 7.7 7.8 7.9 8.0 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 8.9 9.0 9.1 9.2 9.3 9.4 9.5 9.6 9.7
9.8 9.9 10.0 => 1..10
irb(main):004:0> RUBY_VERSION
=> "1.8.7"

ruby1.9 需要加 i.round(2)

(1..10).step(0.1){|i| print i.round(2)," "}

只是显示问题,不影响计算吧?

#14 楼 @sevk 1.9 中是会影响精度的

irb(main):001:0> (1..10).step(0.1){|i| print i,' '} 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9000000000000001 2.0 2.1 2.2 2.3000000000000003 2.4 2.5 2.6 2.7 2.8000000000000003 2.9 3.0 3.1 3.2 3.3000000000000003 3.4000000000000004 3.5 3.6 3.7 3.8000000000000003 3.9000000000000004 4.0 4.1000000000000005 4.2 4.3 4.4 4.5 4.6000000000000005 4.7 4.8 4.9 5.0 5.1000000000000005 5.2 5.3 5.4 5.5 5.6000000000000005 5.7 5.800000000000001 5.9 6.0 6.1000000000000005 6.2 6.300000000000001 6.4 6.5 6.6000000000000005 6.7 6.800000000000001 6.9 7.0 7.1000000000000005 7.2 7.300000000000001 7.4 7.5 7.6000000000000005 7.7 7.800000000000001 7.9 8.0 8.1 8.200000000000001 8.3 8.4 8.5 8.6 8.700000000000001 8.8 8.9 9.0 9.1 9.200000000000001 9.3 9.4 9.5 9.6 9.700000000000001 9.8 9.9 10.0 => 1..10

irb(main):005:0> RUBY_VERSION => "1.9.2"

#15 楼 @sevk Bigdecimal 是解决这个问题的办法

  • 可以使用

(1..24).step(0.5).to_a

  • 也可以使用

1.step(by:0.5, to:24).to_a 或者 1.step(to:24, by:0.5).to_a

  • 也可以使用

1.step(24, 0.5).to_a 可是不能使用1.step(0.5, 24).to_a

需要 登录 后方可回复, 如果你还没有账号请 注册新账号