Rubyでのフロートの丸め


150

丸めに問題があります。私は浮動小数点数を持っていますが、これを小数点第1桁で四捨五入したいと思います。しかし、私は.round基本的にそれをintに変えるものしか使用できません、つまり、2.34.round # => 2. 次のようなことをする簡単な効果の方法はありますか?2.3465 # => 2.35

回答:


181

表示するとき(例えば)

>> '%.2f' % 2.3465
=> "2.35"

丸めて保管したい場合は、

>> (2.3465*100).round / 100.0
=> 2.35

2
ありがとう。sprintfが丸めを処理することを理解していませんでした。 sprintf '%.2f', 2.3465も動作します。
Noah Sussman、

66
value.round(2)はこのソリューションより優れています
Kit Ho

12
ことを覚えておいてください2.3000.round(2) => 2.3sprintf '%.2f', 2.300 => 2.30。私の意見では、これはround()の欠陥か、末尾のゼロを保持するオプションが必要です。
エクスカリバー

14
@Excalibur 2.3000.round(2)は数値であり、文字列ではありません。数2.3がと異なる2.30方法はないため、末尾のゼロを保持するオプションはありません。あなたはnumbers_with_significanceのあなた自身のクラスを作ることができます、しかしそれから我々はすでに文字列を持っています。
Roobie Nuby 14

6
これ小数点以下2桁で機能しますが、'%.3f' % 1.2345(小数点以下2桁ではなく3桁)に欠陥があることに注意してください。で同じsprintfだけでなく、。注意してください。それはほとんどの人が期待するようには戻り=> 1.234 ません => 1.235(つまり、2番目の10進数の後、sprintfは5を切り捨て、6を切り上げるだけです)。そのため、上記のキットホーのコメントには25以上の賛成票があります。安全に使用できる'%.3f' % 1.2345.round(3)ため、数値は.round最初に適切に丸められてからフォーマットされます(必要に応じて、末尾にゼロを付けます)。
likethesky

392

四捨五入する小数点以下の桁数を含む引数を四捨五入に渡します

>> 2.3465.round
=> 2
>> 2.3465.round(2)
=> 2.35
>> 2.3465.round(3)
=> 2.347

8
これは、乗算、丸め、除算よりも賢明に思えます。+1
Mark Embling、2010年

3
うーん、このメソッドはruby 1.8.7にはないようです。たぶん1.9?
Brian Armstrong、

2
@ブライアン。これは間違いなく1.9であり、レールにもあります(この質問にタグ付けされたもの)
Steve Weet

3
Ruby 1.8.7の丸めメソッドにはこの機能がありません。小数点以下丸めパラメーターを追加すると、1.9の機能になります
bobmagoo

1
これで末尾のゼロが取得されないので、1.1.round(2)=> 1.1not1.10
NotAnAmbiTurner

9

これを精度に丸めるために使用できます。

//to_f is for float

salary= 2921.9121
puts salary.to_f.round(2) // to 2 decimal place                   

puts salary.to_f.round() // to 3 decimal place          

7

Floatクラスにメソッドを追加できます。これは、stackoverflowから学びました。

class Float
    def precision(p)
        # Make sure the precision level is actually an integer and > 0
        raise ArgumentError, "#{p} is an invalid precision level. Valid ranges are integers > 0." unless p.class == Fixnum or p < 0
        # Special case for 0 precision so it returns a Fixnum and thus doesn't have a trailing .0
        return self.round if p == 0
        # Standard case  
        return (self * 10**p).round.to_f / 10**p
    end
end

3

また、roundメソッドの引数として負の数を指定して、最も近い10の倍数、100などに丸めることもできます。

# Round to the nearest multiple of 10. 
12.3453.round(-1)       # Output: 10

# Round to the nearest multiple of 100. 
124.3453.round(-2)      # Output: 100

2
def rounding(float,precision)
    return ((float * 10**precision).round.to_f) / (10**precision)
end


1

表示するだけの場合は、number_with_precisionヘルパーを使用します。Steve Weetが指摘したように、別の場所でそれが必要な場合は、round方法


1
これnumber_with_precisionはRails専用のメソッドです。
Smar 2015

0

Ruby 1.8.7の場合、次のコードをコードに追加できます。

class Float
    alias oldround:round
    def round(precision = nil)
        if precision.nil?
            return self
        else
            return ((self * 10**precision).oldround.to_f) / (10**precision)
        end 
    end 
end
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.