如何用 Python 四舍五入到小数点后两位?
Posted
技术标签:
【中文标题】如何用 Python 四舍五入到小数点后两位?【英文标题】:How to round to 2 decimals with Python? 【发布时间】:2013-12-25 18:15:02 【问题描述】:我在这段代码的输出中得到了很多小数(华氏到摄氏转换器)。
我的代码目前如下所示:
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()
所以我的问题是,我如何让程序将每个答案四舍五入到小数点后第二位?
【问题讨论】:
关于您的代码的一个小评论。没有理由将华氏值保留为全局值,将其作为参数传输给您的函数就足够了(而且更好)。因此,删除“全球华氏度”行。在formeln函数中,将参数重命名为函数“Fahreinheit”formeln(Fahreinheit)。至于四舍五入,你可以只使用“%”参数只显示前2位数字,并且应该对这些数字进行四舍五入。对formeln公式中提供的位数没有影响。 【参考方案1】:你可以使用round
函数,它的第一个参数是数字,第二个参数是小数点后的精度。
在你的情况下,它会是:
answer = str(round(answer, 2))
【讨论】:
"Note The behavior ofround()
for floats can be surprising: for example, round(2.675, 2)
gives 2.67
instead of the expected 2.68
."
我不确定是什么促使人们支持上述评论。郑重声明,round(2.675, 2)
给出2.67
而不是2.68
的事实与银行家的四舍五入一点关系都没有。
note:这会改变 answer 的值。如果您只是想四舍五入显示,请使用@Johnsyweb 的答案 - ***.com/a/20457284/1498405
@Johnsyweb 我今天正在尝试,在原始帖子发布一年之后,它看起来按预期工作。似乎 round() 随着时间的推移而演变。见下文:round(1.379, 2) -> 1.38 round(1.372, 2) -> 1.37 round(1.375, 2) -> 1.38
@NightFurry,你需要试试2.675
,而不是1.375
。仍然不适用于Python 3.8.2
。【参考方案2】:
使用str.format()
的syntax 来显示 answer
有两位小数(不改变answer
的基础值):
def printC(answer):
print("\nYour Celsius value is :0.2fºC.\n".format(answer))
地点:
:
介绍format spec
0
为数字类型启用符号感知零填充
.2
将 precision 设置为 2
f
将数字显示为定点数
【讨论】:
这是 IMO 最有用的答案 - 保持实际值不变且易于实施!谢谢! 不知道为什么,但 ':0.2f'.format(0.5357706) 给了我 '0.54' (python 3.6) @NoamPeled:为什么不应该呢?0.5357...
更接近于0.54
而不是0.53
,所以四舍五入到0.54
是有意义的。
@Janothan 浮点值不精确。试试":0.20f".format(1.755)
,你就会明白为什么带两位小数的值显示为1.75
。
@jackz314 在我写下这个答案 6.5 年(以及许多 Python 版本)之后,我忘记了为什么我认为零值得包括在内。【参考方案3】:
大多数答案建议round
或format
。 round
有时会向上取整,就我而言,我需要将变量的 value 向下取整,而不仅仅是这样显示。
round(2.357, 2) # -> 2.36
我在这里找到了答案:How do I round a floating point number up to a certain decimal place?
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
【讨论】:
我投了赞成票——这就是我想要的;我喜欢你在 python-poloniex 上的工作:D "值被四舍五入到最接近的 10 的幂减去 ndigits 的倍数;" docs.python.org/3/library/functions.html#round 所以不,round 并不总是四舍五入,例如round(2.354, 2) # -> 2.35
@PeteKirkham 你是对的,我编辑了我的答案以使其更有意义和准确。
-0.54 是向下舍入 -0.5357706 的正确答案,因为它是负数,-0.54
我会使用10**d
而不是int('1' + ('0' * d))
。【参考方案4】:
如果你只想打印四舍五入的结果,你可以使用自 Python 3.6 以来引入的f-strings。语法与str.format()
的format string syntax 相同,不同之处在于您将f
放在文字字符串的前面,并将变量直接放在字符串中的大括号内。
.2f
表示四舍五入到小数点后两位:
number = 3.1415926
print(f"The number rounded to two decimal places is number:.2f")
输出:
The number rounded to two decimal places is 3.14
【讨论】:
这会将 39.555 舍入到 39.55,如果您期望舍入为 39.56,则会给出不正确的结果 如果有人没有将f
放在.2
之后,像14.426599999999999
这样的数字将四舍五入为1.4e+01
。至于 Python 3.8.6【参考方案5】:
你可以使用round函数。
round(80.23456, 3)
会给你一个 80.234 的答案
在你的情况下,使用
answer = str(round(answer, 2))
【讨论】:
【参考方案6】:你想四舍五入你的答案。
round(value,significantDigit)
是执行此操作的普通解决方案,但是当数字立即低于(低于左边)你要四舍五入的数字有一个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-X
,其中X
是您尝试使用round
加上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()
...应该会给你预期的结果。
您也可以使用decimal 库来完成此操作,但我建议的包装器更简单,在某些情况下可能更受欢迎。
编辑:感谢Blckknght 指出5
边缘情况仅适用于某些值here。
【讨论】:
【参考方案7】:如果您需要避免浮点问题进行四舍五入的会计处理,您可以使用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
如果你用合法的四舍五入来管理资金,你应该使用它。
【讨论】:
如果最后一位数字是 0,这将不起作用。例如,数字 39.90 将四舍五入为 39.9 这个方法给你一个十进制值而不是一个字符串。如果你想要一个格式为你想要的字符串,你应该使用@jackz314 如果在 pi 上运行,请使用 pi 版本:apt install python3-numpy 这不起作用。np.round(2.665, 2)
返回 2.66
而 round(2.665, 2)
返回 2.67
。这是我的解决方案。 ***.com/a/53329223/6069907
@SamuelDauzon 当然,我在本地尝试过。我在 python 3.7(win10) 和 numpy 1.19.3 上得到了我的结果。【参考方案8】:
float(str(round(answer, 2)))
float(str(round(0.0556781255, 2)))
【讨论】:
【参考方案9】:您可以使用 round 运算符进行最多 2 位小数
num = round(343.5544, 2)
print(num) // output is 343.55
【讨论】:
【参考方案10】:只需使用带有 %.2f 的格式,即可向下舍入到小数点后 2 位。
def printC(answer):
print "\nYour Celsius value is %.2f C.\n" % answer
【讨论】:
【参考方案11】:如果您不仅需要舍入结果,还需要对舍入结果进行数学运算,那么您可以使用decimal.Decimal
https://docs.python.org/2/library/decimal.html
from decimal import Decimal, ROUND_DOWN
Decimal('7.325').quantize(Decimal('.01'), rounding=ROUND_DOWN)
Decimal('7.32')
【讨论】:
【参考方案12】:可以使用python“%”的字符串格式化操作符。 “%.2f”表示小数点后2位。
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
【讨论】:
【参考方案13】:这是我使用的一个例子:
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)
【讨论】:
【参考方案14】:为了避免来自 round() 的惊人价值,这是我的做法:
Round = lambda x, n: eval('"%.'+str(int(n))+'f" % '+repr(int(x)+round(float('.'+str(float(x)).split('.')[1]),n)))
print(Round(2, 2)) # 2.00
print(Round(2.675, 2)) # 2.68
【讨论】:
【参考方案15】:round(12.3956 - 0.005, 2) # minus 0.005, then round.
答案来自:https://***.com/a/29651462/8025086
【讨论】:
【参考方案16】:from decimal import Decimal, ROUND_HALF_UP
# Here are all your options for rounding:
# This one offers the most out of the box control
# ROUND_05UP ROUND_DOWN ROUND_HALF_DOWN ROUND_HALF_UP
# ROUND_CEILING ROUND_FLOOR ROUND_HALF_EVEN ROUND_UP
our_value = Decimal(16.0/7)
output = Decimal(our_value.quantize(Decimal('.01'),
rounding=ROUND_HALF_UP))
print output
【讨论】:
【参考方案17】:因为您想要十进制数字的答案,所以您不需要在 printC() 函数中将 answer 变量类型转换为 str 。
然后使用printf-style String Formatting
【讨论】:
【参考方案18】:不知道为什么,但 ':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
【讨论】:
这是截断,不是舍入。 :0.2f 正确舍入了该值。您的解决方案不是四舍五入。以上是关于如何用 Python 四舍五入到小数点后两位?的主要内容,如果未能解决你的问题,请参考以下文章