2012-06-25 6 views
5

私は現在counts["email"]を、数値が82,000のハッシュに、totalという値130万を含む変数で除算しようとしています。Fixnumを別のFixnumで分割できないのはなぜですか?

私はputs counts["email"]/totalを実行すると、私は0

は、なぜ私はこれらに除算を実行することはできません取得しますか?

+1

両方のオペランドが整数の場合、Rubyは整数除算を実行します。http://mathworld.wolfram.com/IntegerDivision.html –

答えて

7

これはRubyの仕組みなので、整数を整数に分割すると整数になります。この場合、結果の整数部分であるため、0になります。

浮動小数点の結果を得るには、実際に浮動小数点数が必要だとRubyに伝えてください。それを行うには多くの方法があります、私はあなたが期待できないものの1

puts counts["email"]/total.to_f 
+3

Rubyだけでなく、これが大部分のプログラミング言語の動作です!分母を浮動小数点数に変換することは、これを解決する唯一の方法ではありません。数学的精度が望まれるなら、 'Rational(counts [" email "]、total)'が優れています。 'Rational'は1.9より前のバージョンの標準ライブラリにあることに注意してください。 – Max

+0

私は、言語が動的にタイプされているのか静的にタイプされているのかを議論しています。後者が 'Float'型であっても、Perl、JavaScript、PHP(私が最もよく働いた言語)はここで浮動小数点値を出力します。 – raina77ow

+1

RubyとPython 2.7(Python 3ではなく)は、動的除算型言語であり、整数除算の結果はfloatではなく整数商となります。 – Max

0

「完全な」結果を得るには、浮動小数点数を使用する必要があります。

counts["email"]/total.to_f 
9

あなたは、除算を実行している...最も簡単なだけでフロートするオペランドの1に変換されるだろうと思います。

# Integer division: 
5/4  # => 1 

# Floating point division: 
5.fdiv(4) # => 1.25 

# Rational division: 
5.quo(4) # => Rational(5, 4) 

ます。またFloatRationalにあなたの整数のいずれかを変換することができます:最初のfdivを呼び出す

5.to_f/4 # => 1.25 
5.to_r/4 # => Rational(5, 4) 

注意が直接fasterで呼び出すよりも、Rubyで整数を分割するさまざまな方法があります。 to_f、次に/演算子を使用します。また、浮動小数点除算を使用していることが明らかになります。

+0

-1のコメントをいただければ幸いです。 –

関連する問題