フロートをjrubyで小数点以下2桁に丸める方法


172

JRuby1.6.x。フロートをjrubyの小数点以下の桁数に丸めるにはどうすればよいですか。

number = 1.1164
number.round(2)

The above shows the following error
wrong number of arguments (1 for 0)

これを小数点第2位に四捨五入するにはどうすればよいですか?

回答:


87

Float#roundは、Ruby 1.8ではなくRuby 1.9でパラメーターを受け取ることができます。JRubyのデフォルトは1.8ですが、1.9モード実行できます


1
通貨のようなものを提示する目的で数値を丸めるのはサムの意図ではないようですが、これを行おうとすると#round(precision)を使用しても意図したとおりに機能しないことに注意してください(3 .round(2)#=> 3.0、3.00ではありません)。これを取得するには、以下のTheoの回答を確認してください。
jaredsmith 2014年

290
(5.65235534).round(2)
#=> 5.65

12
(5.6).round(2)は5.6のみを返します
Bala Karthik

3
妥当なように見えますが、余分なゼロプレースホルダーはまだ存在していますが、表示されていません
boulder_ruby

@BalaKarthikそれが私がテオのソリューションを使用しているまさにその理由です。これは正しく丸められます(奇妙な理由で小数点以下3桁を超えている場合を除き、コメントを参照してください)。そのため、文字列出力を探している場合は、これがより良い解決策です。
Dylan Vander Berg

これは正しいです。私はランダムな緯度と経度を生成していたので、6桁にnumber.round(6)を使用しました
gsumk

199

sprintf('%.2f', number)不可解ですが、数値をフォーマットする非常に強力な方法です。結果は常に文字列ですが、丸めているので、とにかくプレゼンテーションの目的でそれを行っていると思います。sprintfほぼすべての数値を好きなようにフォーマットできます。

sprintfの完全なドキュメント:http : //www.ruby-doc.org/core-2.0.0/Kernel.html#method-i-sprintf


79
'%.2f' % numberまた、作品は、少なくとも私の経験では、より一般的に見られます。
Michael Kohl

6
@MichaelKohl Rubyスタイルガイドは、バージョンよりもsprintf(またはformat)優先し%ます。その理由はここで説明しますが、ほとんどは読みやすさに関するものです。私たち全員がいくつかの理由を挙げてスタイルガイドに従う必要があるわけではありません:)
Lucy Bain 14

3
3番目の10進数の後、sprintfは5ではなく6に切り上げます。たとえば、sprintf( "%。3f"、1.2225)は "1.222"、sprintf( "%。3f"、1.2226)は "1.223"になります。 「それが重要な場合は、#round
ecoding5の

しかし、0.566666666666666丸め0.57
アンワー

"%.2f"切り上げるの5ではなく切り捨てて、それを修正する方法はありますか?
Mirror318 2016年

3

編集する

フィードバックを得た後、元のソリューションが機能しなかったようです。そのため、提案の1つとして回答を更新しました。

def float_of_2_decimal(float_n) 
  float_n.to_d.round(2, :truncate).to_f
end

小数点以下2桁の丸めた数値が必要な場合は、他の回答も機能します。ただし、小数点以下第2位までの四捨五入を行わずに浮動小数点数を取得する場合、これらの回答は役に立ちません。

したがって、小数点以下第2位までの浮動小数点数を取得するには、この手法を使用しました。場合によっては機能しません

def float_of_2_decimal(float_n)
  float_n.round(3).to_s[0..3].to_f
end

5.6666666666666666666666665.66丸め5.67られる代わりに戻ります。それが誰かを助けることを願って


1
これは機能しません。それを機能させるためには、サイズの数を考慮する必要があります。ここで実装されているパターンを使用すると、次のことができます。 def float_of_2_decimal(float_n) num = float_n.to_s.split('.') num[1] = num[1][0..1] num.join(".").to_f end または、もっと簡単に使用できますfloat_n.to_d.round(2, :truncate).to_f
rorykoehler

小数点以下9より大きいintを持つもの
rorykoehler

ポイントありがとうございます。しかし、提案されたメソッドは、大きな数でも失敗します!
Anwar

以下のための11111111111111111.222222222222222入力として、最初のショー1.112つ目のショー1.11111111111111e+16
アンワル

1
はい、あなたは正しいです...一度前か16以上の場所に。オーバーフローの問題。大きな数値を扱う場合は、大きな10進数に固執するのが最善です。型キャストで問題が発生
rorykoehler

-5

これを試して:

module Util
module MyUtil



    def self.redondear_up(suma,cantidad, decimales=0)

        unless suma.present?
            return nil
        end


        if suma>0
            resultado= (suma.to_f/cantidad)
            return resultado.round(decimales)
        end


        return nil


    end

end 
end 

3
回答ありがとうございます。質問は英語で行われたので、英語に修正してください。
Jared

Puedes traducir tu respuesta ainglés?Preguntas y respuestas enespañoldeben presentir aqui
intcreator 2017年

-15

小数を切り捨てるには、次のコードを使用しました。

<th><%#= sprintf("%0.01f",prom/total) %><!--1dec,aprox-->
    <% if prom == 0 or total == 0 %>
        N.E.
    <% else %>
        <%= Integer((prom/total).to_d*10)*0.1 %><!--1decimal,truncado-->
    <% end %>
        <%#= prom/total %>
</th>

2桁に切り捨てる場合は、 Integr(a*100)*0.01


5
パーセンテージをキャストするときは、誰もこれを行うべきではありません。切り捨てることにより、最も近い小数点以下2桁まで正しくROUNDする機能が失われるため、これは本当に悪い形式です。つまり、0.455は、単に切り捨てると0.45になります。これは、0.46になるはずなので、丸めには不適切です。小数を切り捨てて、常に数値を丸めないでください。丸めない場合、切り上げが発生しなければならない場合、結果は正しくありません。
グガル2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.