194 votes

Comment arrondir un flottant à deux décimales en JRuby ?

Comment arrondir un flottant à deux décimales dans JRuby(1.6.x) ?

number = 1.1164
number.round(2)

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

329voto

boulder_ruby Points 6257
(5.65235534).round(2)
#=> 5.65

20 votes

(5.6).round(2) ne rapporte que 5,6

5 votes

Cela semble raisonnable, le zéro supplémentaire est toujours là, mais il n'est pas visible.

0 votes

@BalaKarthik C'est la raison pour laquelle j'utilise la solution de Theo. Elle arrondit correctement (sauf si vous dépassez 3 décimales pour une raison étrange, voir les commentaires), donc c'est la meilleure solution si vous cherchez une sortie de chaîne.

231voto

Theo Points 60103

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

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

91 votes

'%.2f' % number fonctionne également est plus communément observé, du moins dans mon expérience.

6 votes

@MichaelKohl Le guide de style ruby faveurs sprintf (ou format ) sur le % version. Le raisonnement pour cela est discuté aquí il s'agit surtout d'une question de lisibilité. Je ne dis pas que nous devons tous suivre le guide de style, je donne juste quelques raisons :)

4 votes

Notez qu'après la 3ème décimale, sprintf arrondit sur 6, pas sur 5, par exemple, sprintf("%.3f", 1.2225) sera "1.222", sprintf("%.3f", 1.2226) sera "1.223", si cela a de l'importance pour vous, utilisez #round.

93voto

steenslag Points 29662

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

1 votes

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(precision) ne fonctionnera pas comme prévu si vous essayez de faire cela (3.round(2) #=> 3.0, pas 3.00). Pour cela, consultez la réponse de Theo ci-dessous.

6voto

Anwar Points 895

Editar

Après avoir reçu des commentaires, il semble que la solution originale n'ait pas fonctionné. C'est pourquoi nous avons 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 arrondir Ces réponses n'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 retournera 5.66 au lieu d'arrondir 5.67 . J'espère que cela aidera quelqu'un

1 votes

Ça ne marche pas. Pour que cela fonctionne, vous devez prendre en compte n'importe quel chiffre de taille. En utilisant le modèle mis en place 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 plus simplement, vous pouvez utiliser float_n.to_d.round(2, :truncate).to_f

0 votes

Tout ce qui a un chiffre supérieur à 9 avant la décimale.

0 votes

Merci pour cette remarque. Mais, les méthodes que vous proposez échouent aussi sur les grands nombres !

-6voto

HalleyRios Points 436

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

3 votes

Merci de répondre. Pourriez-vous s'il vous plaît la réviser pour qu'elle soit en anglais, puisque la question a été posée en anglais.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X