2009-09-19 59 views
12

我只是想獲得一個百分比。紅寶石拒絕正確劃分

irb(main):001:0> (25/50) * 100 
=> 0 

這應該是絕對等於50,正如我的計算器所證實的(將同樣的等式複製並粘貼到gcalc中)。爲什麼Ruby拒絕這樣做?

+11

順便說一句,如果在Ruby中實際上分裂了,你真的認爲你會成爲第一個注意到它的人嗎?它總是讓我感到驚訝,人們如何看待意外的行爲,並總是認爲它是語言,圖書館,環境等的錯,而且從來不是他們自己代碼的錯誤...... – 2009-09-19 07:34:46

+0

@Daniel:不僅僅是Ruby,任何語言... – gbn 2009-09-19 09:03:05

+0

大多數語言都是這樣工作的,javascript是一個明顯的例外。實際上Ruby是超酷的,當你需要更高的精度時,它會自動從Fixnum轉移到Bignum。 (順便說一下,還有誰這麼做?肯定有一些人會這麼做......) – DigitalRoss 2009-09-19 09:20:45

回答

28

它正在做整數除法。

基本上,25是一個整數(整數),所以是50,所以當你除另一個時,它會給你另一個整數。

25/50 * 100 = 0.5 * 100 = 0 * 100 = 0 

更好的方法是先乘,然後除。

25 * 100/50 = 2500/50 = 50 

你也可以使用顯式的指定一個小數點的浮點運算:

25.0/50.0 * 100 = 0.5 * 100 = 50 
+1

謝謝你們!我正在計算在open-uri中打開一個文件所完成的百分比。這是我用的:percent =(file_downloaded.to_f/file_length.to_f)* 100 – RyanScottLewis 2009-09-19 07:41:55

+0

然後使用第二種形式。這比試圖轉換爲浮點數更容易。 – 2009-09-19 08:02:10

+0

或者說,第一個解決方案。乘法然後除以一。你知道我的意思。 – 2009-09-19 08:04:40

9

因爲你將一個整數一個整數,所以結果是越來越截斷爲整數( 0.5 - > 0)得到乘以100

之前,但這個工程:

>> (25/50) * 100 
=> 0 
>> (25.0/50) * 100 
=> 50.0 
+0

這是一個很好的解釋。換句話說,如果對你的計算的答案是LESS,那麼1 ... Ruby將使它爲0。 – FlyingV 2015-08-02 20:23:12