Mic*_*per 13 ruby floating-point ruby-on-rails rounding
浮动圆形向上或向下.我总是需要它来向下舍入.
我有解决方案,但我真的不喜欢它...也许有更好的方法.
这就是我要的:
1.9999.round_down(2)
#=> 1.99
1.9901.round_down(2)
#=> 1
Run Code Online (Sandbox Code Playgroud)
我想出了这个解决方案,但我想知道是否有更好的解决方案(我不喜欢我转换浮动两次).有没有这方法?因为我觉得很难找到它.
class Float
def round_down(n=0)
((self * 10**n).to_i).to_f/10**n
end
end
Run Code Online (Sandbox Code Playgroud)
谢谢.
fl0*_*00r 39
1.9999.to_i
#=> 1
1.9999.floor
#=> 1
Run Code Online (Sandbox Code Playgroud)
1秒前回答了fl00r
"%.2f" % 1.93213
#=> 1.93
Run Code Online (Sandbox Code Playgroud)
@kimmmo是对的.
class Float
def round_down(n=0)
self.to_s[/\d+\.\d{#{n}}/].to_f
end
end
Run Code Online (Sandbox Code Playgroud)
ger*_*ime 11
根据@kimmmo的回答,这应该更有效:
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
Run Code Online (Sandbox Code Playgroud)
或者基于@steenslag的回答,可能更高效,因为没有字符串转换:
class Float
def round_down n=0
n < 1 ? self.to_i.to_f : (self - 0.5 / 10**n).round(n)
end
end
Run Code Online (Sandbox Code Playgroud)
Kim*_*hto 10
看起来你只想在n之后删除小数
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
Run Code Online (Sandbox Code Playgroud)
(编辑:没有正则表达式的稍高效版本)
对于任何在现代(Ruby 2.4+)查看这个问题的人来说,floor现在接受一个论点。
> 1.9999.floor(1)
=> 1.9
> 1.9999.floor(2)
=> 1.99
> 1.9999.floor(3)
=> 1.999
> 1.9999.ceil(2)
=> 2.0
Run Code Online (Sandbox Code Playgroud)