IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Ruby Discussion :

Comment arrondir avec ruby


Sujet :

Ruby

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Points : 15
    Points
    15
    Par défaut Comment arrondir avec ruby
    Bonjour,
    comment arrondir un nombre avec deux chiffres après la virgule

    Exemple : en php en utilise round(12,455662) => 12,45
    avec ruby je n'ai pas trouvé de méthode pour la classe float.
    Je souhaite afficher que les deux chiffres après la virgule

    Avec vous une idée??

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2007
    Messages : 552
    Points : 1 058
    Points
    1 058
    Par défaut
    Il existe peut-être une méthode dans ruby mais je ne la connais pas. Voici une façon de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Float
    	def round2
    		i=((self*100).round.to_f)/100
    		return i
    	end
    end
    puts 12.455662.round2
    .

    J'ajoute la méthode round2 à la classe float qui arrondi à 2 chiffres àprès la virgule.
    ZiK un lecteur audio et son blog.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 172
    Points : 219
    Points
    219
    Par défaut
    Citation Envoyé par vinc-mai Voir le message
    Il existe peut-être une méthode dans ruby mais je ne la connais pas.
    Bonjour,

    Il n'y a pas de (simple) méthode effectivement pour le faire. Une autre possibilité est de passer par les formats :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    irb(main):008:0> eval '%.2f' % 12.123453
    => 12.12
    Côme

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Merci à vous deux, en effet j'ai appliqué la méthode suivante :

    def round(number,precision=2)
    ("%01.#{precision}f" %number).to_f
    end

    Tout est possible en Ruby

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 61
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par vinc-mai Voir le message
    Il existe peut-être une méthode dans ruby mais je ne la connais pas. Voici une façon de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Float
    	def round2
    		i=((self*100).round.to_f)/100
    		return i
    	end
    end
    puts 12.455662.round2
    .

    J'ajoute la méthode round2 à la classe float qui arrondi à 2 chiffres àprès la virgule.
    Je viens d'apprendre quelque chose grâce à toi et j'ai aussi appris que pour afficher des chiffres on est pas obligé d'utiliser puts et même si on tape ce code 12,455662.round2 il donnera quand même la valeur arrondie, j'ai utilisé IRB (je sens que ce Forum va me permettre de progresser en Ruby) Encore Merci

  6. #6
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    Citation Envoyé par diaruga Voir le message
    Je viens d'apprendre quelque chose grâce à toi et j'ai aussi appris que pour afficher des chiffres on est pas obligé d'utiliser puts et même si on tape ce code 12,455662.round2 il donnera quand même la valeur arrondie, j'ai utilisé IRB (je sens que ce Forum va me permettre de progresser en Ruby) Encore Merci
    IRB t'affiche systématiquement les valeurs de retour du code exécuté, ce qui est très pratique pour tester / debugger, mais qui ne s'applique pas dans un "vrai" programme Ruby
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 135
    Points : 94
    Points
    94
    Par défaut
    Citation Envoyé par boubek Voir le message

    Tout est possible en Ruby
    Oui! Mais bon , c'est quand même hallucinant que ruby ne dispose pas d'une méthode pour arrondir un float. Je suis sur le biiiip

  8. #8
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par vinc-mai Voir le message
    J'ajoute la méthode round2 à la classe float qui arrondi à 2 chiffres àprès la virgule.
    L'idée est bonne, pourquoi ne pas l'étendre à un nombre paramétrable de décimales ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Float
      def round_by(precision)
        return (self * 10 ** precision).round.to_f / 10 ** precision
      end
    end
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 172
    Points : 219
    Points
    219
    Par défaut
    Citation Envoyé par penguin50 Voir le message
    Oui! Mais bon , c'est quand même hallucinant que ruby ne dispose pas d'une méthode pour arrondir un float. Je suis sur le biiiip
    Hallucinant... J'irais pas jusque là. Ce genre de fonctions est toujours celui que l'on cherche dans un langage tout simplement parce que l'on ne l'utilise pas si souvent.

    Le besoin est surtout lié à une interface utilisateur. Rails apporte une méthode "number_with_precision" pour présenter un nombre arrondis à l'utilisateur. Tu peux aussi utiliser la librairie facets : elle propose d'ajouter une méthode "round_at" à la classe Float.

    Enfin, rien ne t'empêche de militer pour l'introduction d'une telle méthode dans la "core library" : tu laisseras ainsi ton nom dans la communauté, c'est pas rien ! ;-)

  10. #10
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Il y a aussi un autre aspect : un flottant est représenté, en gros, en interne par un couple mantisse/exposant, pas par la liste exhaustive de sa partie entière et de ses décimales. Une fonction Round pourrait donc dans certains cas renvoyer un résultat approximatif, et j'imagine que Matz a eu quelques scrupules à placer dans le "core" de Ruby une méthode aussi peu fiable.

    Le résultat (imprécis) de cet arrondi ne doit donc absolument pas être utilisé pour des traitements ultérieurs, uniquement pour de l'affichage, et Ruby a tout ce qu'il faut pour cela.

    Pour les applications excluant toute approximations, telles les applications financière ou comptable par exemple, il est de toute façon hors de question d'employer des flottants, on n'utilise que des entiers.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2007
    Messages : 552
    Points : 1 058
    Points
    1 058
    Par défaut
    Citation Envoyé par GrandFather Voir le message
    L'idée est bonne, pourquoi ne pas l'étendre à un nombre paramétrable de décimales ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Float
      def round_by(precision)
        return (self * 10 ** precision).round.to_f / 10 ** precision
      end
    end
    C'est la méthode que j'utilise mais j'avais répondu à la question qui portait sur 2 décimales en pensant que chacun pourrait étendre la méthode. (Faut réfléchir un peu soi-même aussi! )
    Merci GrandFather pour avoir étendu la méthode.

    PS: il reste encore à vérifier que précision soit bien un entier.10**1.7 à un sens alors que un arrondi à 1.7 décimale près n'en a pas à ma connaissance.
    ZiK un lecteur audio et son blog.

  12. #12
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    Citation Envoyé par GrandFather Voir le message
    Pour les applications excluant toute approximations, telles les applications financière ou comptable par exemple, il est de toute façon hors de question d'employer des flottants, on n'utilise que des entiers.
    Il me semble bien qu'un type spécifique existe en Ruby pour ce genre de calculs, BigDecimal, qui évite les imprécisions dues aux virgules flottantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    a = Float('0.1') # => 0.1
    b = Float('0.2') # => 0.2
    c = Float('0.3') # => 0.3
    
    puts a + b == c # => false
    
    require 'bigdecimal' # => true
    
    d = BigDecimal('0.1') # => <BigDecimal:40bb734,'0.1E0',4(8)>
    e = BigDecimal('0.2') # => <BigDecimal:40b94fc,'0.2E0',4(8)>
    f = BigDecimal('0.3') # => <BigDecimal:40b72c4,'0.3E0',4(8)>
    
    puts d + e == f # => true
    Les calculs avec du BigDecimal sont beaucoup plus lent ! (source : "The Ruby Programming Language", hein GF )
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  13. #13
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par titoumimi Voir le message
    Il me semble bien qu'un type spécifique existe en Ruby pour ce genre de calculs, BigDecimal, qui évite les imprécisions dues aux virgules flottantes : [...] (source : "The Ruby Programming Language", hein GF )
    Ah oui, bien vu... Mais j'ai une excuse, j'ai toujours pas reçu le bouquin, j'aurais pas dû choisir l'option "traversée de l'Atlantique par méduse express" chez Amazon US...

    En ce qui concerne les performances, à mon avis, BigDecimal est plutôt dédié au calcul scientifique, la solution des entiers reste la plus performante et la plus simple à utiliser pour les applications de gestion ou de calcul financier.

    Citation Envoyé par vinc-mai
    PS: il reste encore à vérifier que précision soit bien un entier.10**1.7 à un sens alors que un arrondi à 1.7 décimale près n'en a pas à ma connaissance.
    Tout à fait. Mais on en arrive alors à un tel niveau qu'on peut se demander s'il est encore opportun d'utiliser un Float.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  14. #14
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut
    On peut le faire facilement comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    nbr = "156.939090"
    nbr_float = sprintf( "%.2f", nbr )
    puts nbr_float;

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par boubek Voir le message
    comment arrondir un nombre avec deux chiffres après la virgule
    Avec vous une idée??
    Avec la méthode dédiée #round

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    1.6797.round(2) => 1.68

  16. #16
    Membre extrêmement actif
    Avatar de Madmac
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    1 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 685
    Points : 1 376
    Points
    1 376
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par penguin50 Voir le message
    Oui! Mais bon , c'est quand même hallucinant que ruby ne dispose pas d'une méthode pour arrondir un float. Je suis sur le biiiip
    C'est parce que tu as approché le problème d'une façon procédurale. Ruby est un langage POO.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # Ruby program for round()
    # method in Numeric
     
    # Initialize a number 
    num1 = 12.32
    num2 = -1321.998321
    num3 = -12.2321
     
    # Prints round
    puts num1.round(1)
    puts num2.round(2)
    puts num3.round(3)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment identifier les paires de mur avec Ruby
    Par bayari dans le forum Langages de programmation
    Réponses: 0
    Dernier message: 05/07/2010, 11h58
  2. [C#] Comment arrondir les angles d'un Label avec borderRadius ?
    Par Anto03 dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 29/09/2008, 15h47
  3. [Source] Comment arrondir un nombre avec une précision variable
    Par OhMonBato dans le forum Vos contributions VB6
    Réponses: 2
    Dernier message: 31/03/2007, 12h44
  4. PRocédure stocké, comment appeler avec delphi?
    Par SkyDev dans le forum Bases de données
    Réponses: 3
    Dernier message: 09/04/2004, 18h20
  5. Réponses: 8
    Dernier message: 13/01/2003, 17h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo