25

私は次のような数字を取得しています

2.36363636363636
4.567563
1.234566465448465
10.5857447736

Rubyでこれらの数値を0.05に最も近い値に切り上げる(または切り捨てる)にはどうすればよいですか?

4

9 に答える 9

25
[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]
于 2009-08-28T10:53:43.750 に答える
21

このリンクをチェックしてください、私はそれがあなたが必要としているものだと思います。 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
于 2009-08-28T10:50:08.843 に答える
19

一般に、「最も近いxに丸める」ためのアルゴリズムは次のとおりです。

round(x / precision)) * precision

1 / precision整数であるため(したがって、少し速く動作するため)、乗算する方がよい場合があります。

round(x * (1 / precision)) / (1 / precision)

あなたの場合、それは次のようになります。

round(x * (1 / 0.05)) / (1 / 0.05)

これは次のように評価されます:

round(x * 20) / 20;

私はPythonを知らないので、構文が正しくない可能性がありますが、理解できると確信しています。

于 2009-08-28T11:07:34.220 に答える
11

精度は劣りますが、この方法はほとんどの人がこのページをグーグルで検索しているものです

(5.65235534).round(2)
#=> 5.65
于 2013-02-28T09:41:42.577 に答える
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

と仕様:

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

と使用法:

require 'rounding'
2.36363636363636.round_by(0.05)

hth。

于 2012-04-05T18:35:08.537 に答える
4

Stringクラスの%メソッドで数値を丸めることができます。

例えば

"%.2f" % 5.555555555

"5.56"結果として(文字列)を与えます。

于 2014-02-20T10:40:36.797 に答える
4

Ruby2にラウンド関数が追加されました。

# Ruby 2.3
(2.5).round
 3

# Ruby 2.4
(2.5).round
 2

ルビーには次の2.4ようなオプションもあります 。:even:up:down

(4.5).round(half: :up)
 5
于 2016-12-08T16:44:48.287 に答える
2

小数点なしの丸め結果を取得するには、Floatの.roundを使用します

5.44.round
=> 5

5.54.round
=> 6
于 2014-10-24T19:52:12.360 に答える
0

質問が古いことは知っていますが、他の人を助けるために私の発明を世界と共有したいと思います。これは、浮動小数点数をステップで丸め、小数点以下を最も近い与えられた数値に丸める方法です。たとえば、製品の価格を四捨五入する場合に便利です。

def round_with_step(value, rounding)
  decimals = rounding.to_i
  rounded_value = value.round(decimals)

  step_number = (rounding - rounding.to_i) * 10
  if step_number != 0
    step = step_number * 10**(0-decimals)
    rounded_value = ((value / step).round * step)
  end

  return (decimals > 0 ? "%.2f" : "%g") % rounded_value
end

# For example, the value is 234.567
#
# | ROUNDING | RETURN | STEP
# | 1        | 234.60 | 0.1
# | -1       | 230    | 10
# | 1.5      | 234.50 | 5 * 0.1 = 0.5
# | -1.5     | 250    | 5 * 10  = 50
# | 1.3      | 234.60 | 3 * 0.1 = 0.3
# | -1.3     | 240    | 3 * 10  = 30
于 2018-06-15T09:25:50.060 に答える