向上或向下绕红宝石漂浮到最接近的0.05

dot*_*tty 25 ruby floating-point rounding

我得到的数字就像

2.36363636363636
4.567563
1.234566465448465
10.5857447736
Run Code Online (Sandbox Code Playgroud)

我如何让Ruby将这些数字向上(或向下)舍入到最接近的0.05?

sep*_*p2k 21

[2.36363636363636, 4.567563, 1.23456646544846, 10.5857447736].map do |x|
  (x*20).round / 20.0
end
#=> [2.35, 4.55, 1.25, 10.6]
Run Code Online (Sandbox Code Playgroud)

  • @ChristopherMaujean 是的,但是(尽管标题)这不是 OP 所要求的。问题的主体说“将这些数字向上(**或向下**)四舍五入到**最近的** 0.05”。无论如何,如果你想四舍五入,请使用 `ceil` 而不是 `round`。 (2认同)

Dam*_*ian 20

检查这个链接,我认为这是你需要的. Ruby舍入

class Float
  def round_to(x)
    (self * 10**x).round.to_f / 10**x
  end

  def ceil_to(x)
    (self * 10**x).ceil.to_f / 10**x
  end

  def floor_to(x)
    (self * 10**x).floor.to_f / 10**x
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 不错的链接.但是,通过摘要,答案会更好,因此它可以独立存在,特别是因为链接的代码与OP要求的不完全相同,即舍入到最接近的0.05,但是舍入到特定的小数位. (8认同)
  • downvote只提供一个链接,跛脚...和一个甚至没有回答问题的链接. (4认同)
  • 更糟糕的是,b/c帖子实际上重新实现了内置的ruby函数回合(小数位数),这是一个坏主意. (3认同)

Bom*_*mbe 18

通常,"舍入到最接近的x " 的算法是:

round(x / precision)) * precision
Run Code Online (Sandbox Code Playgroud)

有时候乘以更好是1 / precision因为它是一个整数(因此它的工作速度更快):

round(x * (1 / precision)) / (1 / precision)
Run Code Online (Sandbox Code Playgroud)

在你的情况下,将是:

round(x * (1 / 0.05)) / (1 / 0.05)
Run Code Online (Sandbox Code Playgroud)

将评估为:

round(x * 20) / 20;
Run Code Online (Sandbox Code Playgroud)

我不知道任何Python,所以语法可能不正确,但我相信你可以搞清楚.

  • 对于红宝石:`(7.125*20).round/20.0 => 7.15` (3认同)

bou*_*uby 11

不太精确,但这种方法是大多数人用Google搜索此页面的方法

(5.65235534).round(2)
#=> 5.65
Run Code Online (Sandbox Code Playgroud)


Rob*_*Rob 8

这是一个以任何给定步长值舍入的通用函数:

在lib中放置:

lib/rounding.rb
class Numeric
  # round a given number to the nearest step
  def round_by(increment)
    (self / increment).round * increment
  end
end
Run Code Online (Sandbox Code Playgroud)

和规格:

require 'rounding'
describe 'nearest increment by 0.5' do
  {0=>0.0,0.5=>0.5,0.60=>0.5,0.75=>1.0, 1.0=>1.0, 1.25=>1.5, 1.5=>1.5}.each_pair do |val, rounded_val|
    it "#{val}.round_by(0.5) ==#{rounded_val}" do val.round_by(0.5).should == rounded_val end
  end
end
Run Code Online (Sandbox Code Playgroud)

和用法:

require 'rounding'
2.36363636363636.round_by(0.05)
Run Code Online (Sandbox Code Playgroud)

心连心.


tok*_*khi 5

Ruby 2 现在有一个 round 函数:

# Ruby 2.3
(2.5).round
 3

# Ruby 2.4
(2.5).round
 2
Run Code Online (Sandbox Code Playgroud)

ruby 中还有一些选项,2.4例如::even:up:down 例如;

(4.5).round(half: :up)
 5
Run Code Online (Sandbox Code Playgroud)