圆形浮动的方法

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)

  • `"%.2f"%1.935 => 1.94`,提问者希望它返回1.93 (3认同)

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)

  • 在我的快速测试中,这个字符串版本大约是kimmmo的`split`版本的两倍,而使用实际数学的第二个版本大约快4倍.数学:对数字有好处. (3认同)

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)

(编辑:没有正则表达式的稍高效版本)

  • 你正在用字符串做数学......多恶心啊!:) (4认同)

edd*_*ddz 5

对于任何在现代(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)