web-dev-qa-db-fra.com

Comment arrondir à 2 décimales avec Python?

Je reçois beaucoup de décimales dans la sortie de ce code (convertisseur Fahrenheit en Celsius).

Mon code ressemble actuellement à ceci:

def main():
    printC(formeln(typeHere()))

def typeHere():
    global Fahrenheit
    try:
        Fahrenheit = int(raw_input("Hi! Enter Fahrenheit value, and get it in Celsius!\n"))
    except ValueError:
        print "\nYour insertion was not a digit!"
        print "We've put your Fahrenheit value to 50!"
        Fahrenheit = 50
    return Fahrenheit

def formeln(c):
    Celsius = (Fahrenheit - 32.00) * 5.00/9.00
    return Celsius

def printC(answer):
    answer = str(answer)
    print "\nYour Celsius value is " + answer + " C.\n"



main()

Ma question est donc la suivante: comment puis-je adapter le programme à chaque réponse jusqu'à la deuxième décimale?

149
Dolcens

Vous pouvez utiliser la fonction round , qui prend comme premier argument le nombre et le second argument la précision.

Dans votre cas, ce serait:

answer = str(round(answer, 2))
269
rolisz

Utiliser str.format()syntaxe pour afficher answer avec deux décimales (sans modifier la valeur sous-jacente de answer):

def printC(answer):
    print "\nYour Celsius value is {:0.2f}ºC.\n".format(answer)

Où:

  • : introduit le spécification de format
  • 0 active le remplissage à zéro avec signalisation pour les types numériques
  • .2 définit le précision sur 2
  • f affiche le nombre sous forme de nombre à virgule fixe
55
Johnsyweb

La plupart des réponses suggérées round ou format. round arrondit parfois, et dans mon cas, j'avais besoin que la valeur de ma variable soit arrondie et non affichée en tant que telle.

round(2.357, 2)  # -> 2.36

J'ai trouvé la réponse ici: Comment puis-je arrondir un nombre à virgule flottante jusqu'à une certaine décimale?

import math
v = 2.357
print(math.ceil(v*100)/100)  # -> 2.36
print(math.floor(v*100)/100)  # -> 2.35

ou:

from math import floor, ceil

def roundDown(n, d=8):
    d = int('1' + ('0' * d))
    return floor(n * d) / d

def roundUp(n, d=8):
    d = int('1' + ('0' * d))
    return ceil(n * d) / d
39
s4w3d0ff
float(str(round(answer, 2)))
float(str(round(0.0556781255, 2)))
10
Mahadi

Utilisez simplement la mise en forme avec% .2f qui vous donne l’arrondi à 2 décimales inférieures.

def printC(answer):
    print "\nYour Celsius value is %.2f C.\n" % answer
5
Santosh Ghimire

Vous voulez arrondir votre réponse.

round(value,significantDigit) est la solution ordinaire pour ce faire, cependant ( parfois ne fonctionne pas comme on pourrait s’attendre du point de vue mathématique lorsque le chiffre immédiatement inférieur (à gauche) du chiffre que vous arrondissez a un 5.

Voici quelques exemples de ce comportement imprévisible:

>>> round(1.0005,3)
1.0
>>> round(2.0005,3)
2.001
>>> round(3.0005,3)
3.001
>>> round(4.0005,3)
4.0
>>> round(1.005,2)
1.0
>>> round(5.005,2)
5.0
>>> round(6.005,2)
6.0
>>> round(7.005,2)
7.0
>>> round(3.005,2)
3.0
>>> round(8.005,2)
8.01

En supposant que votre intention consiste à arrondir les statistiques traditionnelles dans le domaine des statistiques, il s'agit d'un wrapper pratique pour que la fonction round fonctionne comme il se doit et qu'elle nécessite import des éléments supplémentaires tels que Decimal.

>>> round(0.075,2)

0.07

>>> round(0.075+10**(-2*6),2)

0.08

Aha! Donc, sur cette base, nous pouvons créer une fonction ...

def roundTraditional(val,digits):
   return round(val+10**(-len(str(val))-1))

Fondamentalement, cela ajoute une très petite valeur à la chaîne pour l’obliger à arrondir correctement sur les instances imprévisibles où il n’est normalement pas associé à la fonction round lorsque vous vous en attendez. Une valeur pratique à ajouter est 1e-XX est la longueur de la chaîne numérique que vous essayez d'utiliser round sur plus 1.

L’approche consistant à utiliser 10**(-len(val)-1) a été délibérée, car il s’agit du plus petit nombre possible pour forcer le décalage, tout en veillant à ce que la valeur ajoutée ne change jamais l’arrondi, même si la décimale . est manquante. Je pourrais utiliser simplement 10**(-len(val)) avec une if (val>1) conditionnelle _ pour soustraire 1 plus ... mais il est plus simple de toujours soustraire le 1 car cela ne changera pas beaucoup l'application plage de nombres décimaux que cette solution de contournement peut gérer correctement. Cette approche échouera si vos valeurs atteignent les limites du type. Elles échoueront, mais cela devrait fonctionner pour presque toute la plage de valeurs décimales valides.

Donc, le code fini sera quelque chose comme:

def main():
    printC(formeln(typeHere()))

def roundTraditional(val,digits):
    return round(val+10**(-len(str(val))-1))

def typeHere():
    global Fahrenheit
    try:
        Fahrenheit = int(raw_input("Hi! Enter Fahrenheit value, and get it in Celsius!\n"))
    except ValueError:
        print "\nYour insertion was not a digit!"
        print "We've put your Fahrenheit value to 50!"
        Fahrenheit = 50
    return Fahrenheit

def formeln(c):
    Celsius = (Fahrenheit - 32.00) * 5.00/9.00
    return Celsius

def printC(answer):
    answer = str(roundTraditional(answer,2))
    print "\nYour Celsius value is " + answer + " C.\n"

main()

... devrait vous donner les résultats que vous attendez.

Vous pouvez également utiliser la bibliothèque décimale pour ce faire, mais le wrapper que je propose est plus simple et peut être préféré dans certains cas.


Edit: Merci Blckknght pour avoir signalé que le cas marginal 5 ne se produit que pour certaines valeurs ici .

5
Jason R. Mick

Vous pouvez utiliser l'opérateur de formatage de chaîne de python "%". "% .2f" signifie 2 chiffres après le point décimal.

def typeHere():
    try:
        Fahrenheit = int(raw_input("Hi! Enter Fahrenheit value, and get it in Celsius!\n"))
    except ValueError:
        print "\nYour insertion was not a digit!"
        print "We've put your Fahrenheit value to 50!"
        Fahrenheit = 50
    return Fahrenheit

def formeln(Fahrenheit):
    Celsius = (Fahrenheit - 32.0) * 5.0/9.0
    return Celsius

def printC(answer):
    print "\nYour Celsius value is %.2f C.\n" % answer

def main():
    printC(formeln(typeHere()))

main()

http://docs.python.org/2/library/stdtypes.html#string-formatting

3
arieli

Vous pouvez utiliser l'opérateur round jusqu'à 2 décimales.

num = round(343.5544, 2)
print(num) // output is 343.55
1
Asad Manzoor

Voici un exemple que j'ai utilisé:

def volume(self):
    return round(pi * self.radius ** 2 * self.height, 2)

def surface_area(self):
    return round((2 * pi * self.radius * self.height) + (2 * pi * self.radius ** 2), 2)
1
Patrick Hill

Je ne sais pas pourquoi, mais le format "{: 0.2f}" (0.5357706) me donne "0.54". La seule solution qui fonctionne pour moi (python 3.6) est la suivante:

def ceil_floor(x):
    import math
    return math.ceil(x) if x < 0 else math.floor(x)

def round_n_digits(x, n):
    import math
    return ceil_floor(x * math.pow(10, n)) / math.pow(10, n)

round_n_digits(-0.5357706, 2) -> -0.53 
round_n_digits(0.5357706, 2) -> 0.53
1
Noam Peled

Vous pouvez utiliser la fonction round.

round(80.23456, 3)

vous donnera une réponse de 80.234

Dans votre cas, utilisez

answer = str(round(answer, 2))

J'espère que cela t'aides :)

1
Satyaki Sanyal

Comme vous voulez que votre réponse soit en nombre décimal, vous n’avez donc pas besoin de transtyper votre variable answer dans str dans la fonction printC ().

puis utilisez format de chaîne de type printf

0
codiacTushki
round(12.3956 - 0.005, 2)  # minus 0.005, then round.

La réponse est de: https://stackoverflow.com/a/29651462/8025086

0
buxizhizhoum