2011-08-17 37 views
12

圓形的圓形圓形向上或向下彎曲。我總是需要它圓下來。一種圓形的方法浮動圓形下移

我有解決方案,但我不太喜歡它......也許有更好的辦法。

這就是我想要的:

1.9999.round_down(2) 
#=> 1.99 
1.9901.round_down(2) 
#=> 1 

我想出了這個解決辦法,但我想知道是否有更好的解決方案(我不喜歡,我轉換的浮動兩次)。有沒有一種方法呢?因爲我發現很奇怪我找不到它。

class Float 
    def round_down(n=0) 
    ((self * 10**n).to_i).to_f/10**n 
    end 
end 

謝謝。

+0

我喜歡你的解決方案... – reto

+0

你要什麼負數呢?趨向負無窮或趨向於零? – l0b0

+0

這不完全是你想要的(因爲你總是會丟失小數部分),但是如果你轉換爲一個整數,你將總是舍入 - '1.9901.to_i' - 取決於你的場景可以更好。 –

回答

9

根據@kimmmo的回答,這應該會更有效一些:

基於從@steenslag答案
class Float 
    def round_down n=0 
    s = self.to_s 
    l = s.index('.') + 1 + n 
    s.length <= l ? self : s[0,l].to_f 
    end 
end 

1.9991.round_down(3) 
=> 1.999 
1.9991.round_down(2) 
=> 1.99 
1.9991.round_down(0) 
=> 1.0 
1.9991.round_down(5) 
=> 1.9991 

,或者還可能更有效,因爲沒有字符串轉換:

class Float 
    def round_down n=0 
    n < 1 ? self.to_i.to_f : (self - 0.5/10**n).round(n) 
    end 
end 
+0

這個答案也很好。仍然喜歡@ kimmmo他的解決方案,因爲它更短,更易於閱讀。但這也是一個很好的答案!謝謝 –

+0

@michaelkoper:看看第二個解決方案 - 我認爲它更直接,更高效。 – geronime

+3

在我的快速測試中,這個字符串的版本大約是kimmmo的「分裂」版本的兩倍,而使用實際數學的第二個版本仍然快4倍。數學:適合數字。 –

36
1.9999.to_i 
#=> 1 
1.9999.floor 
#=> 1 

回答1秒前fl00r

"%.2f" % 1.93213 
#=> 1.93 

@kimmmo是正確的。

class Float 
    def round_down(n=0) 
    self.to_s[/\d+\.\d{#{n}}/].to_f 
    end 
end 
+1

''%.2f「%1.935 => 1.94',提問者希望它返回1.93 –

+0

@ kimmmo,哦,我知道了 – fl00r

8

看起來你只是想後ň

class Float 
    def round_down(n=0) 
    int,dec=self.to_s.split('.') 
    "#{int}.#{dec[0...n]}".to_f 
    end 
end 


1.9991.round_down(3) 
=> 1.999 
1.9991.round_down(2) 
=> 1.99 
1.9991.round_down(0) 
=> 1.0 
1.9991.round_down(10) 
=> 1.9991 

剝離小數(編輯:稍微更有效的版本,沒有正則表達式)

+0

嘿,我喜歡這個主意! –

+0

不應該'1.9991.round_down(0)'返回'1'而不是'1.0'? – Mischa

+0

@mischa'1.0'只是表示它仍然是一個浮動。我想你可以在'n == 0'的情況下使用'to_i'來構建函數,但這可能會讓某些人頭疼。 – brymck

1

在Ruby 1.9:

class Float 
    def floor_with_prec(prec = 0) 
    (self - 0.5).round(prec) 
    end 
end 
+0

'(1.9990 - 0.5).round(2)'=> 1.5(要求它返回1.99) –

+1

@kimmmo對。你可以通過一個小修改來解決這個問題,我想:'(self - 0.5/10 ** prec).round(prec)'。不過,我不確定這是否會因浮點問題而被打敗。 – brymck

1
class Float 
    def rownd_down(digits = 1) 
    ("%.#{digits+1}f" % self)[0..-2].to_f 
    end 
end 

> 1.9991.rownd_down(3) 
=> 1.999 
> 1.9991.rownd_down(2) 
=> 1.99 
> 1.9991.rownd_down(10) 
> 1.9991 
-1

這爲我工作。

> (1.999).to_i.to_f 

對於圍捕你可以只使用

> (1.999+1).to_i.to_f 
0
class Float 
    def round_down(n) 
    num = self.round(n) 
    num > self ? (num - 0.1**n) : num 
    end 
end 

56.0.round_down(-1) = 50。同樣適用於負數,如果您同意四捨五入使數字更小:-56.09.round_down(1) = -56.1

0

發現這篇文章有幫助:https://richonrails.com/articles/rounding-numbers-in-ruby

這裏是圓上下方法:

class Float 
    def round_down(exp = 0) 
    multiplier = 10 ** exp 
    ((self * multiplier).floor).to_f/multiplier.to_f 
    end 

    def round_up(exp = 0) 
    multiplier = 10 ** exp 
    ((self * multiplier).ceil).to_f/multiplier.to_f 
    end 
end