Comment arrondir un flotteur à deux décimales dans jruby

172

JRuby 1.6.x. Comment arrondissez-vous un flotteur à des décimales dans jruby.

number = 1.1164
number.round(2)

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

Comment arrondir ceci à 2 décimales?

Sam
la source

Réponses:

87

Float # round peut prendre un paramètre dans Ruby 1.9, pas dans Ruby 1.8. JRuby est par défaut 1,8, mais il est capable de fonctionner en mode 1.9 .

Steenslag
la source
1
Je sais que Sam ne semble pas avoir l'intention d'arrondir le nombre dans le but de présenter quelque chose comme une monnaie, mais sachez que l'utilisation de #round (précision) ne fonctionnera pas comme prévu si vous essayez de le faire (3 .round (2) # => 3.0, pas 3.00). Pour l'obtenir, consultez la réponse de Theo ci-dessous.
jaredsmith
290
(5.65235534).round(2)
#=> 5.65
boulder_ruby
la source
12
(5.6).round(2)revient seulement 5,6
Bala Karthik
3
semble raisonnable, cet espace réservé à zéro supplémentaire est toujours là, il n'est tout simplement pas visible
boulder_ruby
@BalaKarthik C'est la raison même pour laquelle j'utilise la solution de Theo. Il arrondit correctement (sauf si vous dépassez 3 décimales pour une raison étrange, voir les commentaires), c'est donc la meilleure solution si vous recherchez une sortie de chaîne.
Dylan Vander Berg
c'est juste. J'étais une latitude et une longitude aléatoires de génération, donc j'utilise number.round (6) pour 6 chiffres
gsumk
199

sprintf('%.2f', number)est un moyen cryptique mais très puissant de formater des nombres. Le résultat est toujours une chaîne, mais puisque vous arrondissez, je suppose que vous le faites de toute façon à des fins de présentation. sprintfpeut formater n'importe quel nombre presque comme vous le souhaitez, et bien plus encore.

Documentation complète du sprintf: http://www.ruby-doc.org/core-2.0.0/Kernel.html#method-i-sprintf

Théo
la source
79
'%.2f' % numberfonctionne aussi est plus couramment vu, du moins dans mon expérience.
Michael Kohl
6
@MichaelKohl Le guide de style ruby privilégie sprintf(ou format) la %version. Un raisonnement à cela est discuté ici , il s'agit principalement de lisibilité. Non pas que nous devions tous suivre le guide de style, en donnant juste quelques raisons :)
Lucy Bain
3
notez qu'après la 3e décimale, sprintf arrondit à 6, pas à 5, par exemple, sprintf ("%. 3f", 1.2225) sera "1.222", sprintf ("%. 3f", 1.2226) sera "1.223 ", si cela compte pour vous, tenez-vous en à utiliser #round
ecoding5
Mais 0.566666666666666arrondit à0.57
Anwar
"%.2f"arrondit 5vers le bas, plutôt que vers le haut, y a-t-il un moyen de résoudre ce problème?
Mirror318 du
3

Éditer

Après avoir reçu des commentaires, il semble que la solution originale n'a pas fonctionné. C'est pourquoi a mis à jour la réponse comme l'une des suggestions.

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

D'autres réponses peuvent fonctionner, si vous voulez avoir des nombres arrondis de 2 décimales. Mais, si vous voulez avoir des nombres à virgule flottante avec les deux premières décimales sans arrondi , ces réponses ne vous aideront pas.

Donc, pour obtenir un nombre à virgule flottante avec les deux premières décimales, j'ai utilisé cette technique. Ne fonctionne pas dans certains cas

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

avec 5.666666666666666666666666, il reviendra 5.66au lieu d'arrondi 5.67. J'espère que cela aidera quelqu'un

Anwar
la source
1
Cela ne marche pas. Pour le faire fonctionner, vous devez tenir compte de tout numéro de taille. En utilisant le modèle implémenté ici, vous pouvez: def float_of_2_decimal(float_n) num = float_n.to_s.split('.') num[1] = num[1][0..1] num.join(".").to_f end Ou bien plus simple, vous pouvez utiliserfloat_n.to_d.round(2, :truncate).to_f
rorykoehler
Tout ce avec un entier plus grand que 9 avant la décimale
rorykoehler
Merci pour le point. Mais, vos méthodes suggérées échouent également sur de grands nombres!
Anwar
Pour 11111111111111111.222222222222222comme entrée, le premier montre 1.11et le second montre1.11111111111111e+16
Anwar
1
Oui vous avez raison ... une fois 16 places devant ou plus. Problème de débordement. Il est préférable de s'en tenir au grand nombre décimal si vous travaillez avec de grands nombres. Le typage introduit un problème
rorykoehler
-5

Essaye ça:

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 
HalleyRios
la source
3
Merci de répondre. Pourriez-vous s'il vous plaît la réviser pour qu'elle soit en anglais, car la question a été posée en anglais.
Jared
Puedes traducir tu respuesta a inglés? Preguntas y respuestas en español deben existir aqui .
intcreator
-15

pour tronquer une décimale, j'ai utilisé le code suivant:

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

Si vous souhaitez tronquer à 2 décimales, vous devez utiliser Integr(a*100)*0.01

Ivan Carrasco Quiroz
la source
5
Personne ne devrait JAMAIS faire cela lors du casting des pourcentages. C'est vraiment une mauvaise forme car en tronquant vous perdez la possibilité de ARRONDI correctement aux 2 décimales les plus proches. c'est-à-dire 0,455 si vous tronquez simplement, vous obtenez 0,45, ce qui est faux pour arrondir car cela devrait donner 0,46. Ne tronquez jamais une décimale en arrondissant toujours le nombre, sinon le résultat sera erroné lorsque l'arrondissement doit se produire.
The Gugaru