Je lisais juste les nouveautés de Python 3.0 et il dit:
La stratégie d'arrondi de la fonction round () et le type de retour ont changé. Les observations à mi-chemin exactes sont désormais arrondies au résultat pair le plus proche au lieu de s'éloigner de zéro. (Par exemple, round (2.5) renvoie désormais 2 au lieu de 3.)
et la documentation pour le tour :
Pour les types intégrés prenant en charge round (), les valeurs sont arrondies au multiple le plus proche de 10 à la puissance moins n; si deux multiples sont également proches, l'arrondi est effectué vers le choix pair
Donc, sous v2.7.3 :
In [85]: round(2.5)
Out[85]: 3.0
In [86]: round(3.5)
Out[86]: 4.0
comme je m'y attendais. Cependant, maintenant sous la v3.2.3 :
In [32]: round(2.5)
Out[32]: 2
In [33]: round(3.5)
Out[33]: 4
Cela semble contre-intuitif et contraire à ce que je comprends de l'arrondi (et ne peut que faire trébucher les gens). L'anglais n'est pas ma langue maternelle, mais jusqu'à ce que je lise ceci, je pensais savoir ce que signifiait l'arrondi: - / Je suis sûr qu'au moment où la v3 a été introduite, il doit y avoir eu une discussion à ce sujet, mais je n'ai pas pu trouver une bonne raison dans ma recherche.
- Quelqu'un a-t-il une idée de pourquoi cela a été changé en cela?
- Y a-t-il d'autres langages de programmation traditionnels (par exemple, C, C ++, Java, Perl, ..) qui font ce genre d'arrondi (pour moi incohérent)?
Qu'est-ce que j'oublie ici?
MISE À JOUR: Le commentaire de @ Li-aungYip concernant "l'arrondi du banquier" m'a donné le bon terme de recherche / mots-clés à rechercher et j'ai trouvé cette question SO: Pourquoi .NET utilise-t-il l'arrondi du banquier par défaut? , donc je vais lire cela attentivement.
la source
Réponses:
La méthode de Python 3.0 est considérée comme la méthode d'arrondi standard de nos jours, bien que certaines implémentations de langage ne soient pas encore sur le bus.
La technique simple "toujours arrondir 0,5 vers le haut" entraîne un léger biais vers le nombre le plus élevé. Avec un grand nombre de calculs, cela peut être significatif. L'approche Python 3.0 élimine ce problème.
Il existe plus d'une méthode d'arrondi couramment utilisée. IEEE 754, la norme internationale pour les mathématiques en virgule flottante, définit cinq méthodes d'arrondi différentes (celle utilisée par Python 3.0 est la méthode par défaut). Et il y en a d'autres.
Ce comportement n'est pas aussi connu qu'il devrait l'être. AppleScript a été, si je me souviens bien, l'un des premiers à adopter cette méthode d'arrondi. La
round
commande dans AppleScript offre en fait plusieurs options, mais round-vers-even est la valeur par défaut, comme c'est le cas dans IEEE 754. Apparemment, l'ingénieur qui a implémenté laround
commande en a eu tellement marre de toutes les demandes pour "le faire fonctionner comme je l'ai appris dans école "qu'il a implémenté juste que:round 2.5 rounding as taught in school
est une commande AppleScript valide. :-)la source
3
pour2.5.round
Vous pouvez contrôler l'arrondi obtenu dans Py3000 à l'aide du module Décimal :
la source
ROUND_HALF_UP
est la même que l'ancien comportement de Python 2.X.setcontext()
fonction.quantize(decimal.Decimal('1')
enquantize(decimal.Decimal('0.00')
si vous voulez arrondir aux 100 plus proches, par exemple pour de l'argent.round(number, ndigits)
aussi longtemps que celandigits
est positif, mais vous ne pouvez malheureusement pas l'utiliser pour remplacer quelque chose commeround(5, -1)
.Juste pour ajouter ici une note importante de la documentation:
https://docs.python.org/dev/library/functions.html#round
Ne soyez donc pas surpris d'obtenir les résultats suivants dans Python 3.2:
la source
2.675
exactement: le plus proche que l'ordinateur peut obtenir est2.67499999999999982236431605997495353221893310546875
. C'est assez proche, mais ce n'est pas exactement égal à2.675
: c'est très légèrement plus proche de2.67
que de2.68
. Ainsi, laround
fonction fait la bonne chose et l'arrondit à la valeur la plus proche à 2 chiffres après le point, à savoir2.67
. Cela n'a rien à voir avec Python, et tout à voir avec la virgule flottante binaire.J'ai récemment eu des problèmes avec ça. Par conséquent, j'ai développé un module python 3 qui a 2 fonctions trueround () et trueround_precision () qui abordent ce problème et donnent le même comportement d'arrondi que celui utilisé à partir de l'école primaire (pas l'arrondi du banquier). Voici le module. Enregistrez simplement le code et copiez-le ou importez-le. Remarque: le module trueround_precision peut changer le comportement d'arrondi en fonction des besoins en fonction des indicateurs ROUND_CEILING, ROUND_DOWN, ROUND_FLOOR, ROUND_HALF_DOWN, ROUND_HALF_EVEN, ROUND_HALF_UP, ROUND_UP et ROUND_05UP dans la documentation du module décimal (voir info sur les modules). Pour les fonctions ci-dessous, consultez les docstrings ou utilisez help (trueround) et help (trueround_precision) si copié dans un interpréteur pour plus de documentation.
J'espère que cela t'aides,
Narnie
la source
Python 3.x arrondit les valeurs .5 à un voisin qui est pair
cependant, on peut changer l'arrondi décimal "en arrière" pour toujours arrondir 0,5 vers le haut, si nécessaire:
la source
Comportement d'arrondi de Python 2 en python 3.
Ajout de 1 à la 15e décimale. Précision jusqu'à 15 chiffres.
la source
2.675
est2.67499999999999982236431605997495353221893310546875
. L'ajout de 1e-15 le fera basculer au-dessus de 2,675 et l'arrondira correctement. si la fraction est déjà au-dessus de la constante de code, l'ajout de 1e-15 ne changera rien à l'arrondi.Certains cas:
Pour réparer:
Si vous voulez plus de décimales, par exemple 4, vous devez ajouter (+ 0.0000001).
Travaille pour moi.
la source
Reproduction d'échantillon:
API: https://docs.python.org/3/library/functions.html#round
États:
Compte tenu de ces informations, vous pouvez utiliser des mathématiques pour le résoudre
maintenant vous pouvez exécuter le même test avec my_round au lieu de round.
la source
Le moyen le plus simple d'arrondir en Python 3.x comme enseigné à l'école consiste à utiliser une variable auxiliaire:
Et ce seront les résultats de la série 2.0 à 3.0 (par pas de 0,1):
la source
Vous pouvez contrôler l'arrondi que vous utilisez à l'aide du module math.ceil:
la source
Essayez ce code:
Le résultat sera:
Vous pouvez vérifier la sortie ici: https://i.stack.imgur.com/QQUkS.png
la source