如何用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条纹情况只发生在这里的某些值。