web-dev-qa-db-ja.com

Rubyの丸めフロート

丸めに問題があります。私は浮動小数点数を持っています。これを小数の100分の1に丸めます。ただし、基本的にintに変換する.roundのみを使用できます。つまり、2.34.round # => 2.は、2.3465 # => 2.35のようなことを行う簡単な効果方法はありますか

145
user211662

表示するとき、使用できます(たとえば)

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

丸めて保存する場合は、使用できます

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

丸める小数点以下の桁数を含む引数をroundに渡します

>> 2.3465.round
=> 2
>> 2.3465.round(2)
=> 2.35
>> 2.3465.round(3)
=> 2.347
382
Steve Weet

これを使用して精度に丸めることができます。

//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
tech bun

Float Classにメソッドを追加できます。私はこれを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
7
Albert Català

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
3
BrunoFacca

(2.3465*100).round()/100.0はどうですか?

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

表示するだけなら、 number_with_precision ヘルパーを使用します。必要な場合は、Steve Weetが指摘したように、roundメソッドを使用します。

1
Fer

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
0
Robert