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

Python Discussion :

Arrondir au centième inférieur ou supérieur


Sujet :

Python

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 328
    Points : 240
    Points
    240
    Par défaut Arrondir au centième inférieur ou supérieur
    Bonjour à tous,

    Un petit problème simple mais dont je ne trouve pas la solution.

    J'ai un float (un montant en euros) que je souhaite arrondir au centième supérieur ou inférieur (en fonction du choix de l'utilisateur).

    Exemple :
    - 10.45678 € > 10.45 € ou 10.46 €

    Merci pour vos suggestions !

  2. #2
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Multiplier par 100 et prendre la partie entière, puis diviser par 100.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Si c'est une application sérieuse, il vaut mieux éviter d'utiliser des floats pour représenter des montants.
    Le module decimal est plus adapté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> import decimal
    >>> from decimal import Decimal
    >>> x = Decimal('10.45678')
    >>> x.quantize(Decimal('0.01'), decimal.ROUND_UP)
    Decimal('10.46')
    >>> x.quantize(Decimal('0.01'), decimal.ROUND_DOWN)
    Decimal('10.45')

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 328
    Points : 240
    Points
    240
    Par défaut
    Merci pour vos réponses.

    C'est celle de dividee qui correspond le plus à ce que j'attendais.

    Mais pourrais-tu me préciser pour quelle raison faut-il éviter les FLOAT pour les montants ?

    Merci

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Citation Envoyé par Ggamer Voir le message
    Mais pourrais-tu me préciser pour quelle raison faut-il éviter les FLOAT pour les montants ?
    La représentation interne des floats se faisant en binaire, des nombres dont la représentation décimale s'écrit avec un nombre même limité de chiffres ne sont pas représentables de façon exacte par un float. Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> 1.1
    1.1000000000000001
    Evidemment, l'erreur est minime, mais elle est sujette au calcul d'erreur et s'accroit potentiellement à chaque opération qu'on effectue dessus.
    Comme les floats en Python sont en réalité des "double" en C (double précision, 64 bits), cela peut mettre longtemps avant que l'erreur soit suffisante pour poser un problème, mais cela peut se manifester plus rapidement si on n'y prend pas garde.
    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> 0.1 + 0.1 + 0.1 == 0.3
    False # uh ?
    ... raison pour laquelle il faut fortement se méfier de l'utilisation de l'égalité avec des floats.

    Et je pense qu'il y a une autre difficulté, qui n'est pas directement liée au floats mais qui est quand-même mitigée par le module decimal:
    Je n'y connais pas grand chose en comptabilité, mais je crois qu'il y a des règles à suivre concernant la précision des calculs; contrairement à ce qu'on fait d'habitude en informatique, on ne garde pas la précision maximale dans les calculs intermédiaires, il faut arrondir à chaque étape dans un sens donné et avec une précision donnée. Ce que le module decimal permet, il me semble, en définissant la précision et le mode d'arrondi. Mais je peux me tromper sur ce dernier point...

  6. #6
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Je n'y connais pas grand chose en comptabilité,
    La plupart des logiciels de compta n'utilise que des entiers (c'est indispensable pour la balance). De fait l'unité est toujours le plus petit sous-multiple de la devise utilisée. De fait les écritures sont passées en centimes (par exemple) et ce n'est qu'à l'affichage sur les listings qu'on met une virgule.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Merci pour la précision, Zavonen. En somme, cela revient à travailler en "fixed-point" au lieu de "floating-point".

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 328
    Points : 240
    Points
    240
    Par défaut
    Un grand merci pour ces informations !

    (Bien que je vous haïsse tout autant pour m'obliger maintenant à recoder une partie de mon logiciel )

    A +

Discussions similaires

  1. Arrondir un nombre à sa valeur supérieure ou inférieure
    Par philben dans le forum Contribuez
    Réponses: 5
    Dernier message: 08/02/2013, 12h35
  2. Arrondir à l'heure à l'inférieur ou supérieur
    Par arnaudperfect dans le forum Excel
    Réponses: 4
    Dernier message: 12/05/2009, 13h03
  3. Réponses: 6
    Dernier message: 21/06/2007, 16h13
  4. [pl/sql]dizaine inférieure et supérieure d'un nombre
    Par Fleur-Anne.Blain dans le forum Oracle
    Réponses: 8
    Dernier message: 18/08/2006, 14h49
  5. Arrondir à l'entier inférieur?
    Par Death83 dans le forum Langage
    Réponses: 2
    Dernier message: 27/12/2005, 01h03

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