可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I am getting a lot of decimals in the output of this code (Fahrenheit to Celsius converter).
My code currently looks like this:
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()
So my question is, how to I successfully make the program round down every answer to 2 decimals?
回答1:
You can use the round function, which takes as first argument the number and the second argument is the precision.
In your case, it would be:
answer = str(round(answer, 2))
回答2:
Using str.format()
's syntax to display answer
with two decimal places (without altering the underlying value of answer
):
Where:
:
introduces the format spec 0
enables sign-aware zero-padding for numeric types .2
sets the precision to 2
f
displays the number as a fixed-point number
回答3:
The question is labeled: "how to round down to 2 decimals"
Most answers suggested round
or format
. round
sometimes rounds up, and in my case I needed the value of my variable to be always rounded down (not just displayed as such).
round(2.357, 2) # -> 2.36
I found the true answer here: How to round a floating point number up to certain decimal place?
import math v = 2.357 print(math.ceil(v*100)/100) # -> 2.36 print(math.floor(v*100)/100) # -> 2.35
or:
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
回答4:
float(str(round(answer, 2))) float(str(round(0.0556781255, 2)))
回答5:
Just use the formatting with %.2f which gives you rounding down to 2 decimals.
def printC(answer): print "\nYour Celsius value is %.2f C.\n" % answer
回答6:
You can use the string formatting operator of python "%". "%.2f" means 2 digits after the decimal point.
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
回答7:
Here is an example that I used:
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)
回答8:
As you want your answer in decimal number so you dont need to typecast your answer variable to str in printC() function.
and then use printf-style String Formatting
回答9:
You can use the round function.
round(80.23456, 3)
will give you an answer of 80.234
In your case, use
answer = str(round(answer, 2))
Hope this helps :)
回答10:
You want to round your answer.
round(value,significantDigit)
is the ordinary solution to do this, however this sometimes does not operate as one would expect from a math perspective when the digit immediately inferior (to the left of) the digit you're rounding to has a 5
.
Here's some examples of this unpredictable behavior:
>>> 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
Assuming your intent is to do the traditional rounding for statistics in the sciences, this is a handy wrapper to get the round
function working as expected needing to import
extra stuff like Decimal
.
>>> round(0.075,2) 0.07 >>> round(0.075+10**(-2*6),2) 0.08
Aha! So based on this we can make a function...
def roundTraditional(val,digits): return round(val+10**(-len(str(val))-1))
Basically this adds a really small value to the string to force it to round up properly on the unpredictable instances where it doesn't ordinarily with the round
function when you expect it to. A convenient value to add is 1e-X
where X
is the length of the number string you're trying to use round
on plus 1
.
The approach of using 10**(-len(val)-1)
was deliberate, as it the largest small number you can add to force the shift, while also ensuring that the value you add never changes the rounding even if the decimal .
is missing. I could use just 10**(-len(val))
with a condiditional if (val>1)
to subtract 1
more... but it's simpler to just always subtract the 1
as that won't change much the applicable range of decimal numbers this workaround can properly handle. This approach will fail if your values reaches the limits of the type, this will fail, but for nearly the entire range of valid decimal values it should work.
So the finished code will be something like:
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()
...should give you the results you expect.
You can also use the decimal library to accomplish this, but the wrapper I propose is simpler and may be preferred in some cases.
Edit: Thanks Blckknght for pointing out that the 5
fringe case occurs only for certain values here.