2012-06-25 9 views
5

Şu anda counts["email"]'u, 1.3 milyon değerini içeren bir total değişkeniyle 82.000 sayısını içeren bir karma ayırmaya çalışıyorum.Neden bir fixnum'u başka bir fixnum'a bölemem?

Ben puts counts["email"]/total çalıştırdığınızda

Neden bunlara üzerinde bölünme gerçekleştiremez 0. Ben olsun?

+1

Her iki işlenen tamsayı ise, Ruby tamsayı bölümü gerçekleştirir: http://mathworld.wolfram.com/IntegerDivision.html –

cevap

7

Çünkü Ruby bu şekilde çalışır: tam sayıyı tamsayıya böldüğünüzde, tamsayı alırsınız. Bu durumda 0 olacak, çünkü sonucun tamsayı kısmı.

Şamandıra sonucunu elde etmek için, Ruby'ye gerçekten bir şamandıra ihtiyacınız olduğunu söyleyin! bunu yapmak için birçok yol vardır konum, sana beklenmemektedir bir halde

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

Sadece Ruby değil, programlama dillerinin çoğunun davranışı budur! Paydayı bir float'a dönüştürmek de bunu çözmenin tek yolu değildir. Eğer matematiksel doğruluk isteniyorsa, 'Rational (sayım ["email"], total) 'üstün olurdu. “Rational” ın, 1.9'dan önceki sürümlerde standart kitaplıkta olduğunu unutmayın. – Max

+0

Düşüncelerin, dilin dinamik veya statik olarak yazılmış olup olmadığıdır. Perl, JavaScript ve PHP (en çok çalıştığım diller), float değerini burada basar - sonuncu 'Float' türüne sahip olsa bile. – raina77ow

+1

Ruby ve Python 2.7 (Python 3 değil), tamsayı bölmesinin bir kayan nokta yerine tamsayı bölümü ile sonuçlandığı dinamik olarak yazılan dillerdir. – Max

0

"Tam" sonucu elde etmek için şamandıraları kullanmanız gerekir.

counts["email"]/total.to_f 
9

Sen, bölünme performans ... en basit sadece Float için işlenen bir dönüştürmek olacağını tahmin ediyorum.

# Integer division: 
5/4  # => 1 

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

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

Ayrıca Float veya Rational için tamsayılar birini dönüştürebilirsiniz:: İlk fdiv çağıran

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

Not doğrudan faster olduğunu çağırmaktan daha Ruby tamsayılar bölmek için birçok farklı yolu vardır to_f ve ardından / işlecini kullanma. Ayrıca, kayan noktalı bölümleri kullandığınızı da netleştirir.

+0

-1 için bir yorum takdir edilecektir. –