[#37021] [RAA] RAA/2.3 — "U.Nakamura" <usa@...>

みなさんこんにちは。

20 messages 2003/01/30

[ruby-list:36915] Numeric#round_to

From: Take_tk <ggb03124@...>
Date: 2003-01-08 07:19:25 UTC
List: ruby-list #36915
たけ(tk)です

 桁位置を指定して四捨五入するメソッドはないのでしょうか?
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-math/301
7 Jun 2000 From: Wakou Aoyama
でも話題になっていたようですが……

----
#! ruby -Ks
#-- Numeric_round_to.rb
#-- Numeric_ex.rb
#-- Float_fixed_cmp.rb


class Numeric
  require "Numeric_bankers_round"

  def bankers_round_to(column=-4)
    divider = 10.0**column
    return (self/divider).bankers_round*divider
  end
  alias bankers_round2 bankers_round_to

  def round_to(column=-4)
    divider = 10.0**column
    return (self/divider).round*divider
  end
  alias round2 round_to

  def ceil_to(column=-4)
    divider = 10.0**column
    return (self/divider).ceil*divider
  end
  alias ceil2 ceil_to

  def floor_to(column=-4)
    divider = 10.0**column
    return (self/divider).floor*divider
  end
  alias floor2 floor_to

end

if __FILE__ == $0

  require "complex"
  require "Complex_round"

  p 1234567.ceil_to(3)	##1235000.0
  p 1234567.floor_to(3)	##1234000.0

  p 1234567.round_to(3)	##1235000.0
  p 1234500.round_to(3)	##1235000.0
  p 1235500.round_to(3)	##1236000.0
  p 1236500.round_to(3)	##1237000.0

  p 1234567.bankers_round_to(3)	##1235000.0
  p 1234500.bankers_round_to(3)	##1234000.0
  p 1235500.bankers_round_to(3)	##1236000.0
  p 1236500.bankers_round_to(3)	##1236000.0

  p 1.234.round_to(-2)	##1.23

  p 1.600000024.round_to(-4)  #=> 1.6
  p 1.799999952.round_to(-4)  #=> 1.8
  p 2.200000048.round_to(-4)  #=> 2.2
  p 2.299999952.round_to(-4)  #=> 2.3

  p 49.round_to(1)  #=> 50.0
  p 50.round_to(1)  #=> 50.0
  p 49.round_to(2)  #=> 0.0
  p 50.round_to(2)  #=> 100.0

  p Complex(2.200000048,1.799999952).round_to(-4)  #=> Complex(2.2, 1.8)
  p Complex(2.200000048,1.799999952).floor_to(-4)  #=> Complex(2.2, 1.7999)
  p Complex(2.200000048,1.799999952).ceil_to(-4)   #=> Complex(2.2001, 1.8)
end
----

=begin

 【某言語のヘルプより】

RoundTo 関数は,「Banker's Rounding」を使って浮動小数点値を指定された桁
数(10 の累乗)に丸めます。

説明:
RoundTo 関数を呼び出すと,AValue を指定された 10 の累乗に丸めることができます。

RoundTo は,「Banker's Rounding」を使って,適切な有効桁数を持つ 2 つの値
のちょうど中間にある値の丸め方法を判断します。この方法では,AValue がど
ちらの値にも近くない場合に偶数に丸められます。

SimpleRoundTo は,非対称の計算丸めを使って,適切な有効桁数を持つ 2 つの
値のちょうど中間にある値の丸め方法を判断します。この方法では,常に大きい
方の値に丸められます。

例:
RoundTo(1234567, 3)	1234000
RoundTo(1.234, -2)	1.23

=end


Take_tk = KUMAGAI Hidetake
たけ(tk)=熊谷秀武


In This Thread

Prev Next