2017-05-23 8 views
0

浮動小数点をループする必要がありますが、正しい構文が見つかりません。スケッチプラグインのフローティングループ

(-1.0).upto(1.0).step(0.1) do |t| 
    ... 
end 

私は次のエラーを取得する:

Error: #NoMethodError: undefined method `upto' for -1.0:Float>

EDIT:このループを行うには、 "良い" またはより良い方法はありますか?私が試した何

+0

(あなたは、フローティングポイントを丸める必要があります除く)それは全然良いアイデアではありませんが、これは動作します: '(-1.0..1.0)。ステップ(0.1).to_a.each {| E | e} ' – yzalavin

+0

@yzalavinなぜそれはいいアイデアではないのですか?それを行う "良い"方法はありますか? – sinsedrix

+0

downvoteはその理由を説明してもよいですか? – sinsedrix

答えて

1

一つの選択肢はRange上のステップを使用することで、独自の同様の方法で作成することができます。

(-1.0..1.0).step(0.1) { |i| 
    puts i 
} 

0.1をインクリメントしている間は浮動小数点t精度の問題です。だからそれを考慮に入れてください。

-1.0 
-0.9 
-0.8 
-0.7 
-0.6 
-0.5 
-0.39999999999999997 
-0.29999999999999993 
-0.19999999999999996 
-0.09999999999999995 
5.551115123125783e-17 
0.10000000000000006 
0.20000000000000007 
0.30000000000000004 
0.4000000000000001 
0.5000000000000001 
0.6000000000000001 
0.7000000000000001 
0.8 
0.9000000000000001 
1.0 
0

は、フロートには#upto方法はありませんが、あなたは

class Float 
    def upto(target, options={}) 
    options = {step: 1.0}.merge(options) 
    current_value = self 
    while current_value < target 
     yield current_value 
     current_value += options[:step] 
    end 
    end 
end 

ます。次に行うことができます...

(-1.0).upto(1.0, step: 0.1) do |t| 
    ... 
end 
+0

質問は、彼が拡張子を生産だ示し、SketchUpのの文脈にあるので、SketchUpの拡張倉庫にホストされている拡張機能は衝突を避けるために、RubyのAPIの名前空間を変更することが許可されていないことは注目に値します。代わりに、floatを引数として取らなければなりません。 – thomthom

関連する問題