丸めに問題があります。私は浮動小数点数を持っていますが、これを小数点第1桁で四捨五入したいと思います。しかし、私は.round
基本的にそれをintに変えるものしか使用できません、つまり、2.34.round # => 2.
次のようなことをする簡単な効果の方法はありますか?2.3465 # => 2.35
丸めに問題があります。私は浮動小数点数を持っていますが、これを小数点第1桁で四捨五入したいと思います。しかし、私は.round
基本的にそれをintに変えるものしか使用できません、つまり、2.34.round # => 2.
次のようなことをする簡単な効果の方法はありますか?2.3465 # => 2.35
回答:
表示するとき(例えば)
>> '%.2f' % 2.3465
=> "2.35"
丸めて保管したい場合は、
>> (2.3465*100).round / 100.0
=> 2.35
2.3000.round(2) => 2.3
とsprintf '%.2f', 2.300 => 2.30
。私の意見では、これはround()の欠陥か、末尾のゼロを保持するオプションが必要です。
2.3000.round(2)
は数値であり、文字列ではありません。数2.3
がと異なる2.30
方法はないため、末尾のゼロを保持するオプションはありません。あなたはnumbers_with_significanceのあなた自身のクラスを作ることができます、しかしそれから我々はすでに文字列を持っています。
'%.3f' % 1.2345
(小数点以下2桁ではなく3桁)に欠陥があることに注意してください。で同じsprintf
だけでなく、。注意してください。それはほとんどの人が期待するようには戻り=> 1.234
ません => 1.235
(つまり、2番目の10進数の後、sprintfは5を切り捨て、6を切り上げるだけです)。そのため、上記のキットホーのコメントには25以上の賛成票があります。安全に使用できる'%.3f' % 1.2345.round(3)
ため、数値は.round
最初に適切に丸められてからフォーマットされます(必要に応じて、末尾にゼロを付けます)。
四捨五入する小数点以下の桁数を含む引数を四捨五入に渡します
>> 2.3465.round
=> 2
>> 2.3465.round(2)
=> 2.35
>> 2.3465.round(3)
=> 2.347
1.1.round(2)
=> 1.1
not1.10
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
def rounding(float,precision)
return ((float * 10**precision).round.to_f) / (10**precision)
end
表示するだけの場合は、number_with_precisionヘルパーを使用します。Steve Weetが指摘したように、別の場所でそれが必要な場合は、round
方法
number_with_precision
はRails専用のメソッドです。
sprintf '%.2f', 2.3465
も動作します。