La documentation de la fonction round () indique que vous lui transmettez un nombre et que les positions après la virgule sont arrondies. Ainsi, il devrait faire ceci:
n = 5.59
round(n, 1) # 5.6
Mais, en réalité, la bonne vieille bizarrerie en virgule flottante s'infiltre et vous obtenez:
5.5999999999999996
Pour les besoins de l'interface utilisateur, je dois afficher 5.6
. J'ai fouillé sur Internet et j'ai trouvé de la documentation indiquant que cela dépend de mon implémentation de Python. Malheureusement, cela se produit à la fois sur ma machine de développement Windows et sur chaque serveur Linux que j'ai essayé. Voir aussi ici .
À moins de créer ma propre bibliothèque ronde, y a-t-il un moyen de contourner cela?
python
floating-point
rounding
swilliams
la source
la source
round(5.55, 1) = 5.5
.Réponses:
Je ne peux pas m'empêcher de savoir comment il est stocké, mais au moins le formatage fonctionne correctement:
la source
print '%.2f' % 655.665
mais ça revient655.66
, ça devrait être655.67
from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_DOWN
# utiliser pour arrondir les nombres flottantsDecimal(str(655.665)).quantize(Decimal('1.11'), rounding=ROUND_HALF_UP)
# Problèmes et limitations en virgule flottanteLe formatage fonctionne correctement même sans avoir à arrondir:
la source
"{:.1f}".format(n)
'%.5f' % 0.988625
0.98862
Si vous utilisez le module Decimal, vous pouvez effectuer une approximation sans utiliser la fonction «round». Voici ce que j'ai utilisé pour arrondir en particulier lors de l'écriture d'applications monétaires:
Cela renverra un nombre décimal qui est 16,20.
la source
rounding='ROUND_UP'
NameError: global name 'ROUND_UP' is not defined
vous devez importer votre fonction d' arrondi:from decimal import Decimal, ROUND_UP
. Autres fonctions d'arrondiround(5.59, 1)
fonctionne bien. Le problème est que 5.6 ne peut pas être représenté exactement en virgule flottante binaire.Comme le dit Vinko, vous pouvez utiliser le formatage de chaîne pour arrondir l'affichage.
Python a un module pour l'arithmétique décimale si vous en avez besoin.
la source
Vous obtenez «5,6» si vous le faites
str(round(n, 1))
au lieu de simplementround(n, 1)
.la source
Vous pouvez changer le type de données en un entier:
Et puis affichez le nombre en insérant le séparateur décimal des paramètres régionaux.
Cependant, la réponse de Jimmy est meilleure.
la source
Les calculs en virgule flottante sont vulnérables aux imprécisions de précision légères mais ennuyeuses. Si vous pouvez travailler avec des nombres entiers ou des virgules fixes, vous aurez une précision garantie.
la source
Jetez un œil au module Decimal
et
Decimal fournit le type d'opérations qui facilitent l'écriture d'applications qui nécessitent des opérations en virgule flottante et qui doivent également présenter ces résultats dans un format lisible par l'homme, par exemple la comptabilité.
la source
printf la ventouse.
la source
C'est un gros problème en effet. Essayez ce code:
Il affiche 4,85. Ensuite, vous faites:
et cela montre 4,8. Calculez-vous à la main, la réponse exacte est 4,85, mais si vous essayez:
vous pouvez voir la vérité: le point flottant est stocké comme la somme finie la plus proche de fractions dont les dénominateurs sont des puissances de deux.
la source
Vous pouvez utiliser l'opérateur de format de chaîne
%
, similaire à sprintf.la source
Fonctionne parfaitement
la source
Je fais:
Dans ce cas, nous arrondissons d'abord correctement au niveau de l'unité, puis nous convertissons en entier pour éviter d'imprimer un flottant.
alors
Je pense que cette réponse fonctionne mieux que le formatage de la chaîne, et cela me rend également plus sensé d'utiliser la fonction round.
la source
J'éviterais de me fier du
round()
tout dans ce cas. Considérersortira
qui n'est pas une sortie souhaitée si vous avez besoin d'un arrondi solide à l'entier le plus proche. Pour contourner ce comportement, allez avec
math.ceil()
(oumath.floor()
si vous voulez arrondir):les sorties
J'espère que cela pourra aider.
la source
Code:
Production:
la source
Voici où je vois l'échec du cycle. Et si vous vouliez arrondir ces 2 nombres à une décimale? 23,45 23,55 J'ai appris qu'en arrondissant ces chiffres, vous devriez obtenir: 23,4 23,6 la «règle» étant que vous devez arrondir si le nombre précédent est impair, et non arrondir si le nombre précédent est pair. La fonction round en python tronque simplement le 5.
la source
Le problème est seulement lorsque le dernier chiffre est 5. Par exemple. 0,045 est stocké en interne sous la forme 0,044999999999999 ... Vous pouvez simplement incrémenter le dernier chiffre à 6 et arrondir. Cela vous donnera les résultats souhaités.
la source
Une autre option potentielle est:
la source
Qu'en est-il de:
la source
epsilon = .000001
alorsround(1.0/5.0, 1) + epsilon
prendrait la représentation précise 0,2 et la rendrait 0,00001. Des problèmes tout aussi graves se produiraient si l'epsilon était à l'intérieur de la fonction round.