私はRuby2.3.1を使用していますが、これが私ができるようにしたいことです。
1.33333333.ceil(2) -> 1.34
1.33333333.floor(3) -> 1.333
このFloat#round
メソッドでは丸めることができますが、#ceil
and#floor
メソッドと同様に、切り上げるか切り下げるかを指定できる必要がありますが、保持する小数点以下の桁数を指定するパラメーターを使用します。
ではルビー2.4+、Float#float
およびFloat#ceil
方法が取るndigits
引数:
1.33333333.ceil(2) -> 1.34
1.33333333.floor(3) -> 1.333
ただし、これらのSTDlibメソッドでこの動作を確認してください。
# In Ruby 2.4.2:
0.07.ceil(2) -> 0.08
1.1.ceil(2) -> 1.11
私の本ではOKではありません。
古いバージョンのRubyの場合、またはSTB libが提供するよりも良い結果を得たい場合は、独自のメソッドを作成する必要があります。そこにはいくつかの異なるブログ投稿があり、それらが一貫して正しくない理由を後で説明しますが、毎回正しく機能する必要があるいくつかの方法を次に示します。
require 'bigdecimal'
class Float
def ceil2(exp = 0)
BigDecimal(self.to_s).ceil(exp).to_f
end
def floor2(exp = 0)
BigDecimal(self.to_s).floor(exp).to_f
end
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
# These methods also produce bad results for the examples shown above
0.07.ceil(2) -> 0.08
1.1.ceil(2) -> 1.11
何が起こっているのかについては詳しく説明しませんが(ここまたはここで確認できます)、浮動小数点演算は煩雑になる可能性があり、丸め誤差が発生します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加