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?
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))
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 format0
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 fixeLa 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
float(str(round(answer, 2)))
float(str(round(0.0556781255, 2)))
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
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-X
où X
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 .
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
Vous pouvez utiliser l'opérateur round jusqu'à 2 décimales.
num = round(343.5544, 2)
print(num) // output is 343.55
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)
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
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 :)
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
round(12.3956 - 0.005, 2) # minus 0.005, then round.
La réponse est de: https://stackoverflow.com/a/29651462/8025086