Ruby'deki bölme neden ondalık değer yerine bir tamsayı döndürüyor?


256

Örneğin:

9 / 5  #=> 1

ama bekliyordum 1.8. Doğru ondalık (tamsayı olmayan) sonucu nasıl alabilirim? Neden geri dönüyor 1?


4
Bu değeri döndürmek için gerçekten bir yöntem kullanıyorsanız, bunu bir değişkene atamanız gerekmediğini unutmayın; sadece def method; a - b/8; endÇağırılırken son sentezleme dönüş değeri olarak, yöntemi hesaplama sonucunu döndürecektir.
Phrogz

Yanıtlar:


268

Tamsayı bölme yapıyor. Aşağıdakilerden birini Floatekleyerek numaralardan birini yapabilirsiniz .0:

9.0 / 5  #=> 1.8
9 / 5.0  #=> 1.8

10
Bu işe yarıyor ancak aşağıdaki to_f yanıtı daha yararlı görünüyor. Ruby'de to_f daha deyimsel mi?
notapatch

9
.to_fEğer örneğin tamsayılar içeren iki değişken bölüyorlar eğer cevap daha iyidir a.to_f / b. Kelimenin tam anlamıyla iki sabit kodlu tamsayıyı bölüyorsanız (muhtemelen gariptir), o zaman kullanmak 9.0 / 5iyidir.
jefflunt

350

Tamsayı bölme yapıyor. to_fOlayları kayan nokta moduna zorlamak için kullanabilirsiniz :

9.to_f / 5  #=> 1.8
9 / 5.to_f  #=> 1.8

Değerleriniz değişmez değerler yerine değişkense bu da işe yarar. Bir değeri bir kayan noktaya dönüştürmek, tüm ifadeyi kayan nokta aritmetiğine zorlamak için yeterlidir.


1
Bu, kabul edilen cevaptan daha fazla "ray" cevabıdır.
Sean Ryan

@muistooshort: Kopyalayamıyorum, üzgünüm. Muhtemelen yanlış bir şey yapıyordum.
Joao Costa

4
@SeanRyan Neden genel olarak Ruby yerine Raylar? Bir (Ruby on) Rails geliştiricisinin neden bu özel şeyi genel Ruby geliştiricisinden farklı yapacağını anlamıyorum. Belki de sadece anlambilim anlamındayım ve çoğu insan böyle durumlarda Rails ve Ruby'yi eş anlamlı olarak görüyor.
Chinoto Vokro

169

Numeric#fdivBunun yerine kullanabileceğiniz yöntem de vardır :

9.fdiv(5)  #=> 1.8

1
Bu test ettiğim en hızlı yöntem, daha fazla performans elde etmenin tek yolu, başlangıçta yüzen olan işlenenleri bölmektir. Sözdizimini öğrenmek için Ruby'de asal sayı üreteci oluşturdum, şimdi neyin en iyi çalıştığını öğrenmek için optimize ediyorum. İşte araya kriter var: 'base64' gerektirir; gerektiren 'zlib'; koyar Zlib.inflate (Base64.decode64 ( "eJxlkMEOwiAQRO98hekFuGzxQEwPXvwR01ZqiYHqBk2Tln8XDlWgnDbM25nJonq9NaoD7ZTtR9PigxK09zM7AkgRHieXTYHOsBNf1nklM6B6TuhYpdp + rPgSdiCOi / d / kQ71QBOtAVFLEDly05 + UYQ2H + MckL6z0zioDdJG1S9K1K4iQAW66DhnmiqRYKEJFXMByux + XuOJ2XdO60dKsjC7aBtyTL5O5hLk ="))
Chinoto Vokro

Bir soru, 'ondalık' kullandığımız gibi hassasiyeti koruyacak mı?
Adam Aiken

39

İrb ile kontrol edebilirsiniz:

$ irb
>> 2 / 3
=> 0
>> 2.to_f / 3
=> 0.666666666666667
>> 2 / 3.to_f
=> 0.666666666666667

26

Ruby mathnmodülünü dahil edebilirsiniz .

require 'mathn'

Bu şekilde, bölünmeyi normal şekilde yapabileceksiniz.

1/2              #=> (1/2)
(1/2) ** 3       #=> (1/8)
1/3*3            #=> 1
Math.sin(1/2)    #=> 0.479425538604203

Bu şekilde, örneğin rasyonel olarak ifade edilemeyen bir işlemi uygulamaya karar verene kadar tam bir bölüm (Rational sınıfı) elde edersiniz Math.sin.


1
Mathn modülü yakut 2.2'den beri kullanımdan kaldırıldı
Meier


6

Fixnum # to_r burada belirtilmemiş, yakut 1.9'dan beri tanıtıldı. Fixnum'u rasyonel forma dönüştürür. Aşağıda kullanım örnekleri verilmiştir. Bu, kullanılan tüm sayılar Fixnum olduğu sürece kesin bir bölünme de sağlayabilir.

 a = 1.to_r  #=> (1/1) 
 a = 10.to_r #=> (10/1) 
 a = a / 3   #=> (10/3) 
 a = a * 3   #=> (10/1) 
 a.to_f      #=> 10.0

Rasyonel bir sayı üzerinde çalışan bir şamandıranın, şamandıra sonucunu kapsadığı örnek.

a = 5.to_r   #=> (5/1) 
a = a * 5.0  #=> 25.0 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.