如何用Python舍入到两位小数?


253

在此代码的输出(华氏转摄氏度)中,我得到了很多小数。

我的代码当前如下所示:

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()

所以我的问题是,如何使该程序四舍五入到小数点后第二位?


6
关于您的代码的一句话。没有理由将华氏温度保持为全局值,将其作为参数传递到函数中就足够了(更好)。因此,删除“全球华氏度”行。在formeln函数中,将参数重命名为函数“ Fahreinheit” formeln(Fahreinheit)。对于四舍五入,您可以仅使用“%”参数仅显示前两位数字,并且应该对这些数字进行四舍五入。对formeln公式中提供的位数没有影响。
arieli 2013年

Answers:


441

您可以使用该round函数,该函数将数字作为第一个参数,第二个参数是小数点后的精度。

在您的情况下,它将是:

answer = str(round(answer, 2))


21
这就是所谓的银行家四舍五入。取整为偶数。它在IEEE 754标准中用于浮点数。 en.wikipedia.org/wiki/Rounding#Round_half_to_even
rolisz 2013年

37
我不确定是什么引起了人们对以上评论的支持。为了记录在案,这一事实round(2.675, 2)给了2.67,而不是2.68有什么都没有做与银行家舍入。
Mark Dickinson

3
注意:这会更改答案的值。如果你只是想圆显示,去@Johnsyweb的答案- stackoverflow.com/a/20457284/1498405
hardmooth

4
@Johnsyweb我今天尝试了,比原来的帖子晚了一年,它看起来按预期工作。似乎round()随着时间的推移而发展。参见下文:轮(1.379,2)-> 1.38轮(1.372,2)-> 1.37轮(
1.375,2

81

使用str.format()语法,以显示 answer具有两个小数位(不改变的基础值answer):

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

哪里:

  • :介绍格式规范
  • 0 为数字类型启用符号感知零填充
  • .2精度设置为2
  • f 将数字显示为定点数字

3
这是IMO最有用的答案-保持实际值不变,并且易于实现!谢谢!
BrettJ

不知道为什么,但是'{:0.2f}'。format(0.5357706)给我'0.54'(python 3.6)
Noam Peled

3
@NoamPeled:为什么不呢?比0.5357...靠近,因此四舍五入是有意义的。0.540.530.54
ShadowRanger

"{:0.2f}".format(1.755)-> 1.75- "{:0.2f}".format(1.7551)> 1.76-但是,我都希望两者都等于1.76。
Janothan

(Python版本:3.6.10)
Janothan

48

大多数答案建议roundformatround有时会四舍五入,就我而言,我需要将变量的四舍五入,而不仅仅是这样显示。

round(2.357, 2)  # -> 2.36

我在这里找到了答案:如何将浮点数四舍五入到小数点后一位?

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, 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

1
我投票-这就是我想要的;我喜欢您使用python-poloniex的工作:D
Skylar

2
“值被四舍五入为最接近的十进制乘以n位数。” docs.python.org/3/library/functions.html#round,所以不,回合不一定总是四舍五入,例如round(2.354, 2) # -> 2.35
Pete Kirkham

@PeteKirkham,您是对的,我编辑了答案,使之更有意义和更准确。
s4w3d0ff '18年

2
-0.54是向下舍入-0.5357706的正确答案,因为它是负数,-0.54 <-0.53
s4w3d0ff

2
我会用10**d代替int('1' + ('0' * d))
乔纳森·莱因哈特

11
float(str(round(answer, 2)))
float(str(round(0.0556781255, 2)))

8

您想四舍五入。

round(value,significantDigit)是执行此操作的常规解决方案,但是,当从数字四舍五入到第一个数字(在其左侧)的下方(在其左侧)具有a时,有时这从数学角度来看并不像预期的那样起作用5

以下是这种不可预测的行为的一些示例:

>>> 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

啊哈!因此,基于此我们可以创建一个函数...

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

基本上,这会在字符串中添加一个很小的值,以强制它在无法预料的情况下正确舍入,而在您无法预期的情况下,通常情况下它不会与round函数配合使用。添加一个方便的值是1e-Xwhere X是您要round在plus上尝试使用的数字字符串的长度1

使用该方法的目的10**(-len(val)-1)是故意的,因为它是您可以添加的最大的小数来强制移位,同时还要确保所添加的值不会改变舍入,即使.缺少小数点也是如此。我可以仅10**(-len(val))使用条件if (val>1)减法来减去1...,但是总要减去会更简单,1因为这不会改变此解决方法可以正确处理的十进制数字的适用范围。如果您的值达到该类型的限制,则此方法将失败,但将失败,但是对于几乎所有有效十进制值的范围,它都应起作用。

因此,完成的代码将类似于:

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条纹情况仅在此处的某些值出现。


6

只需使用%.2f的格式,它就可以四舍五入到小数点后两位。

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

4

您可以使用python“%”的字符串格式运算符。“%.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



3

您可以使用舍入功能。

round(80.23456, 3)

会给你80.234的答案

根据您的情况使用

answer = str(round(answer, 2))

希望这可以帮助 :)


2

如果需要避免浮点问题在舍入数字时出现,可以使用numpy round。

您需要安装numpy:

pip install numpy

和代码:

import numpy as np

print(round(2.675, 2))
print(float(np.round(2.675, 2)))

版画

2.67
2.68

如果您通过合法的四舍五入管理资金,则应该使用该选项。


1

这是我使用的示例:

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

不知道为什么,但是'{:0.2f}'。format(0.5357706)给我'0.54'。唯一适用于我的解决方案(python 3.6)如下:

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

这是截断而不是四舍五入。
ShadowRanger


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.