如何用Python舍入到2位小数?
我在这个代码的输出(华氏温度到摄氏转换器)中得到了很多小数。
我的代码目前看起来像这样:
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()
所以我的问题是,如何成功地让程序围绕每个答案小数点后两位?
您可以使用循环函数,其中第一个参数是数字,第二个参数是精度。
在你的情况下,这将是:
answer = str(round(answer, 2))
使用str.format()
的语法 显示两位小数的answer
(不改变answer
的基础值):
def printC(answer): print "\nYour Celsius value is {:0.2f}ºC.\n".format(answer)
哪里:
-
:
介绍格式规范 -
0
为数字types启用标志感知零填充 -
.2
将精度设置为2
-
f
将数字显示为一个定点数字
float(str(round(answer, 2))) float(str(round(0.0556781255, 2)))
问题标注为:“如何舍入到2位小数”
round
总是圆了
round(2.357, 2) # -> 2.36
我在这里find了真正的答案: 如何四舍五入浮点数?
import math v = 2.357 print(math.ceil(v*100)/100) # -> 2.36 print(math.floor(v*100)/100) # -> 2.35
要么:
from math import floor def roundDown(n, d=8): d = int('1' + ('0' * d)) return floor(n * d) / d
只需使用%.2f的格式,即可以舍入到2位小数。
def printC(answer): print "\nYour Celsius value is %.2f C.\n" % answer
你可以使用python“%”的string格式化操作符。 “%.2f”表示小数点后两位数字。
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
因为你想要十进制数的答案,所以你不需要在printC()函数中对你的答案variables进行types转换。
然后使用printf风格的string格式
您可以使用轮function。
round(80.23456, 3)
会给你80.234的答案
在你的情况下,使用
answer = str(round(answer, 2))
希望这可以帮助 :)
你想要回答你的答案。
round(value,significantDigit)
是这样做的普通解决scheme,但是当数字直接位于四舍五入的数字的下方(数字的左侧)有一个5
位数字时, 有时不会像math视angular那样运行。
下面是一些不可预知的行为的例子:
>>> 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
假设你的意图是在传统的统计四舍五入科学,这是一个方便的包装,以获得round
函数按预期工作需要import
额外的东西,如Decimal
。
>>> round(0.075,2) 0.07 >>> round(0.075+10**(-2*6),2) 0.08
啊哈! 所以基于这个我们可以做一个function…
def roundTraditional(val,digits): return round(val+10**(-len(str(val))-1))
基本上,这给string增加了一个非常小的值,迫使它在不可预测的实例上正确地收集,而这些实例通常不会在您期望的情况下使用round
函数。 添加一个方便的值是1e-X
,其中X
是您尝试使用的数字string的长度,加1
。
使用10**(-len(val)-1)
是有意的,因为它是您可以添加的最大的小数来强制转换,同时也确保您添加的值从不改变舍入,即使小数.
不见了。 我可以只使用10**(-len(val))
和condiditional if (val>1)
来减去1
以上…但是总是减去1
会更简单,因为这不会改变适用的范围十进制数字这种解决方法可以正确处理。 如果你的值达到了types的限制,这种方法将失败,这将失败,但几乎所有的有效小数值的范围,它应该工作。
所以完成的代码将如下所示:
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()
…应该给你你期望的结果。
您也可以使用小数点库来实现这一点,但是我提出的包装器更简单,在某些情况下可能是首选。
编辑:谢谢Blckknght指出, 5
条纹情况只发生在这里的某些值。