J'ai essayé d'arrondir de longs nombres flottants comme:
32.268907563;
32.268907563;
31.2396694215;
33.6206896552;
...
Sans succès jusqu'à présent. J'ai essayé math.ceil(x)
, math.floor(x)
(bien que cela arrondisse vers le haut ou vers le bas, ce qui n'est pas ce que je recherche) et round(x)
qui n'a pas fonctionné non plus (toujours des nombres flottants).
"Que pouvais-je faire?"
MODIFIER: CODE:
for i in widthRange:
for j in heightRange:
r, g, b = rgb_im.getpixel((i, j))
h, s, v = colorsys.rgb_to_hsv(r/255.0, g/255.0, b/255.0)
h = h * 360
int(round(h))
print(h)
int(x)
Réponses:
Va l'arrondir et le changer en entier
ÉDITER:
Vous n'affectez int (round (h)) à aucune variable. Lorsque vous appelez int (round (h)), il renvoie le nombre entier mais ne fait rien d'autre; vous devez changer cette ligne pour:
Pour affecter la nouvelle valeur à h
EDIT 2:
Comme @plowman l'a dit dans les commentaires, Python
round()
ne fonctionne pas comme on pourrait s'y attendre normalement, et c'est parce que la façon dont le nombre est stocké sous forme de variable n'est généralement pas la façon dont vous le voyez à l'écran. Il existe de nombreuses réponses qui expliquent ce comportement:round () ne semble pas arrondir correctement
Une façon d'éviter ce problème est d'utiliser la décimale comme indiqué par cette réponse: https://stackoverflow.com/a/15398691/4345659
Pour que cette réponse fonctionne correctement sans utiliser de bibliothèques supplémentaires, il serait pratique d'utiliser une fonction d'arrondi personnalisée. Après beaucoup de corrections, j'ai trouvé la solution suivante, qui autant que j'ai testé a évité tous les problèmes de stockage. Il est basé sur l'utilisation de la représentation sous forme de chaîne, obtenue avec
repr()
(NOTstr()
!). Cela a l'air hacky mais c'était la seule façon que j'ai trouvée pour résoudre tous les cas. Il fonctionne avec Python2 et Python3.Tests:
Enfin, la réponse corrigée serait:
EDIT 3:
Tests:
Le problème ici est que la
dec
-ème décimale peut être 9 et si ledec+1
-ème chiffre> = 5, le 9 deviendra un 0 et un 1 devrait être porté audec-1
-ème chiffre.Si nous prenons cela en considération, nous obtenons:
Dans la situation décrite ci-dessus
b = 10
et la version précédente ne ferait que concaténera
etb
ce qui entraînerait une concaténation de l'10
endroit où le 0 de fin disparaîtrait. Cette version se transformeb
à la bonne décimale en fonctiondec
, comme un report approprié.la source
int(round(4.5))
arrondit à 4 tout enint(round(4.500001))
arrondissant correctement à 5.round(x)
suffit dans Python 3.6.2 (et peut-être aussi dans les versions inférieures). Le résultat est déjà de type int. Remarque:round(x, n)
sera de type float.Utilisez
round(x, y)
. Il arrondira votre nombre à la décimale souhaitée.Par exemple:
la source
round(value,significantDigit)
est la solution ordinaire, mais cela ne fonctionne pas comme on pourrait s'y attendre d'un point de vue mathématique lorsque les valeurs arrondies se terminent par5
. Si le5
est dans le chiffre juste après celui auquel vous êtes arrondi, ces valeurs ne sont parfois arrondies que prévu (c'est-8.005
à- dire que l' arrondi à deux chiffres décimaux donne8.01
). Pour certaines valeurs dues aux bizarreries des mathématiques en virgule flottante, elles sont arrondies à la place!c'est à dire
Bizarre.
En supposant que votre intention est de faire l'arrondi traditionnel pour les statistiques dans les sciences, c'est un wrapper pratique pour faire
round
fonctionner la fonction comme prévu, en ayant besoin deimport
choses supplémentaires commeDecimal
.Ah! Donc, sur cette base, nous pouvons faire une fonction ...
Fondamentalement, cela ajoute une valeur garantie d'être inférieure au chiffre le moins donné de la chaîne sur laquelle vous essayez d'utiliser
round
. En ajoutant cette petite quantité, il préserve leround
comportement de dans la plupart des cas, tout en s'assurant maintenant que si le chiffre inférieur à celui qui est arrondi est arrondi5
, et s'il l'est,4
il arrondit vers le bas.L'approche de l'utilisation a
10**(-len(val)-1)
été délibérée, car il s'agit du plus petit nombre que vous pouvez ajouter pour forcer le décalage, tout en garantissant que la valeur que vous ajoutez ne change jamais l'arrondi même si la décimale.
est manquante. Je pourrais utiliser juste10**(-len(val))
avec une conditionnelleif (val>1)
pour soustraire1
plus ... mais il est plus simple de toujours soustraire1
car cela ne changera pas beaucoup la plage de nombres décimaux applicable que cette solution de contournement peut gérer correctement. Cette approche échouera si vos valeurs atteignent les limites du type, cela échouera, mais pour presque toute la plage de valeurs décimales valides, cela devrait fonctionner.Vous pouvez également utiliser la bibliothèque décimale pour accomplir cela, mais le wrapper que je propose est plus simple et peut être préféré dans certains cas.
Edit: Merci Blckknght d' avoir souligné que le
5
cas de frange ne se produit que pour certaines valeurs. De plus, une version antérieure de cette réponse n'était pas suffisamment explicite pour que le comportement d'arrondi impair se produise uniquement lorsque le chiffre immédiatement inférieur au chiffre auquel vous arrondissez a un5
.la source
5
comme dernier chiffre arrondiront toujours vers le bas. Ce n'est pas le cas dans un test rapide , je viens de le faire avec des chiffres comme1.5
,2.5
,3.5
et ainsi de suite et1.05
,1.15
,1.25
,1.35
arrondi à la première décimale. Le premier ensemble (arrondi par moitié exact à de petits entiers) est toujours arrondi à un entier pair. Ce dernier ensemble ne s'arrondit pas de manière cohérente, probablement en raison de représentations binaires inexactes de certaines valeurs. Les flotteurs qui ont des représentations binaires exactes comme1.25
round ont un chiffre encore moins significatif, mais les autres semblent arrondir de manière aléatoire.round(4.0005,3)
donne4.0
etround(1.0005,3)
donne1.0
, maisround(2.0005,3)
donne2.001
etround(3.0005,3)
donne3.001
. Mais c'est précisément la raison pour laquelle la solution que je propose est nécessaire ... vous ne savez pas à quoi vous attendre du stock stock, sur ce cas significatif!, digits
à la fin de cette déclaration de retour? Sans jeu de mots. ( Moyenne que je veux dire)Pour les points positifs, essayez
Pour que cela fonctionne aussi pour les négatifs, essayez
int()
fonctionne comme une fonction de plancher et vous pouvez donc exploiter cette propriété. C'est certainement le moyen le plus rapide.la source
>>> x=-0.999
>>> int(x), round(x), int(x+0.5)
(0, -1.0, 0)
N'est-ce pas seulement Python qui fait la moitié du tour pour égaliser , comme prescrit par IEEE 754 ?
Soyez prudent en redéfinissant ou en utilisant l'arrondi "non standard" ...
(Voir aussi https://stackoverflow.com/a/33019948/109839 )
la source
Round half to even
n'est absolument pas prescrit par IEEE 754, mais n'est à la place qu'une des nombreuses options d'arrondi décrites par la norme .Round to nearest, ties away from zero
(c'est-à-dire le comportement que la plupart des gens attendent) est également une option, et est la valeur par défaut, par exemple, en C / C ++.round
est expliqué) et il le fait selon la façon dont "arrondir la moitié à égal" est prescrit de travailler (ou décrit) par la norme.Vous pouvez également utiliser numpy en supposant que si vous utilisez python3.x voici un exemple
la source
Votre solution appelle round sans spécifier le deuxième argument (nombre de décimales)
ce qui est un bien meilleur résultat que
À partir de la documentation Python sur https://docs.python.org/3/library/functions.html#round
la source
Si vous avez besoin (par exemple) d'une approximation à deux chiffres pour A, alors vous
int(A*100+0.5)/100.0
ferez ce que vous cherchez.Si vous avez besoin d'une approximation à trois chiffres, multipliez et divisez par 1000, etc.
la source
Quelque chose comme ça devrait aussi fonctionner
la source
À cette fin, je suggérerais simplement de faire la chose suivante -
Cela vous donnera l'entier le plus proche.
J'espère que cela t'aides!!
la source
J'utilise et je peux conseiller la solution suivante (python3.6):
Il fonctionne très bien pour les demi-nombres (positifs et négatifs) et fonctionne encore plus rapidement que int (round (x)):
la source