我想将a
四舍五入为13.95。我尝试使用round
,但是我得到的结果是:
>>> a
13.949999999999999
>>> round(a, 2)
13.949999999999999
如果您遇到了标准库Decimal类的类似问题,请参见如何格式化小数以始终显示2个小数位?。
我想将a
四舍五入为13.95。我尝试使用round
,但是我得到的结果是:
>>> a
13.949999999999999
>>> round(a, 2)
13.949999999999999
如果您遇到了标准库Decimal类的类似问题,请参见如何格式化小数以始终显示2个小数位?。
>>> 125650429603636838/(2**53)
13.949999999999999
>>> 234042163/(2**24)
13.949999988079071
>>> a = 13.946
>>> print(a)
13.946
>>> print("%.2f" % a)
13.95
>>> round(a,2)
13.949999999999999
>>> print("%.2f" % round(a, 2))
13.95
>>> print("{:.2f}".format(a))
13.95
>>> print("{:.2f}".format(round(a, 2)))
13.95
>>> print("{:.15f}".format(round(a, 2)))
13.949999999999999
如果您只需要显示两位小数(例如显示货币值),那么您有几个更好的选择:
"%.2f" % round(a,2)
不仅可以放在 printf 中使用,也可以用在像 str()
这样的函数中。 - andilabsfloat
)只是最接近的十进制数(你作为人类熟悉的数)的可用近似值。0.245 这样的(有限表示的)二进制值不存在,从数学上讲也不可能存在。最接近 0.245 的二进制值略微小于 0.245,因此自然会向下舍入。同样,0.225 在二进制中不存在,但是最接近 0.225 的二进制值略微大于 0.225,因此自然会向上舍入。 - John YDecimal
,这也是这个答案中提出的解决方案之一。另一个解决方案是将您的量转换为整数并使用整数算术运算。这两种方法也出现在其他答案和评论中。 - John Y现在有新的格式规范,即字符串格式规范迷你语言:
您可以执行与以下内容相同的操作:
"{:.2f}".format(13.949999999999999)
注意1:上述代码返回一个字符串。如果需要转换为浮点数,只需使用float(...)
将其包装起来即可:
float("{:.2f}".format(13.949999999999999))
注意2:使用float()
进行包装不会改变任何内容:
>>> x = 13.949999999999999999
>>> x
13.95
>>> g = float("{:.2f}".format(x))
>>> g
13.95
>>> x == g
True
>>> h = round(x, 2)
>>> h
13.95
>>> x == h
True
'{0:,.2f}'.format(1333.949999999)
,输出结果为'1,333.95'
。 - Stephen Blumf"Result is {result:.2f}"
。该字符串会将result
的值插入到花括号中,并格式化为保留两位小数的浮点数。 - Andrey Semakinround(2.16, 1)
返回 2.2
,为什么 Python 只提供了一个 truncate
函数呢? - jiamo>>> round(2.675, 2) 2.67
https://docs.python.org/2/tutorial/floatingpoint.html - Melroy van den Berg>>> f'{a:.2f}'
>>> print(f'Completed in {time.time() - start:.2f}s')
我认为最简单的方法是使用format()
函数。
例如:
a = 13.949999999999999
format(a, '.2f')
13.95
这将生成一个浮点数字符串,精确到小数点后两位。
大多数数字在浮点数中无法精确表示。如果您想要四舍五入数字,因为这是您的数学公式或算法所需的,那么您需要使用 round 函数。如果您只想将显示限制为某个特定精度,则甚至不需要使用 round 函数,只需将其格式化为该字符串即可。(如果您想使用某些替代的舍入方法进行显示,而且有很多种方法,那么您需要混合这两种方法。)
>>> "%.2f" % 3.14159
'3.14'
>>> "%.2f" % 13.9499999
'13.95'
使用
print"{:.2f}".format(a)
取代
print"{0:.2f}".format(a)
因为后者在尝试输出多个变量时可能会导致输出错误(请参见注释)。Python 3.1彻底解决了输入输出的舍入问题,并将修复程序反向移植到Python 2.7.0。可以在浮点数和字符串之间进行可逆转换:str -> float() -> repr() -> float() ... 或者 Decimal -> float -> str -> Decimal
>>> 0.3
0.3
>>> float(repr(0.3)) == 0.3
True
现在不再需要使用 Decimal
类型进行存储。
算术运算的结果必须重新进行舍入,因为舍入误差可能会积累更多的不准确性,超出解析一个数字可能产生的程度。这并没有通过改进的repr()
算法来解决(Python >= 3.1, >=2.7.0):
>>> 0.1 + 0.2
0.30000000000000004
>>> 0.1, 0.2, 0.3
(0.1, 0.2, 0.3)
在Python < 2.7x和 < 3.1版本中,输出字符串函数str(float(...))
的有效数字被舍入为12个,以防止类似于未修复的repr()输出的非法数字过多。即使减去非常相似的数字后仍然不足,而在其他操作后则会过度舍入。Python 2.7和3.1使用相同长度的str(),尽管repr()已被修复。一些旧版本的Numpy甚至在使用修复的Python时也存在非法数字过多的情况。当前的Numpy已修复此问题。 Python版本>= 3.2的str()和repr()函数及Numpy中类似函数的输出结果相同。
import random
from decimal import Decimal
for _ in range(1000000):
x = random.random()
assert x == float(repr(x)) == float(Decimal(repr(x))) # Reversible repr()
assert str(x) == repr(x)
assert len(repr(round(x, 12))) <= 14 # no excessive decimal places.
请查看Python 2.7发布说明的第四段中的其他语言更改:
现在,在大多数平台上,浮点数和字符串之间的转换已经正确四舍五入。这些转换发生在许多不同的地方:在浮点数和复数上的str();在float和complex构造函数上;在数字格式化、使用marshal、pickle和json模块序列化和反序列化浮点数和复数;在Python代码中解析浮点数和虚数文字;以及Decimal-to-float转换。
与此相关的是,浮点数x的repr()现在返回一个基于最短十进制字符串的结果,该字符串保证在正确舍入(使用四舍六入五取偶舍入模式)下回到x。先前,它给出了基于将x舍入为17个小数位的字符串。
更多信息:在Python 2.7之前,float
的格式与当前的numpy.float64
类似。这两种类型使用相同的64位IEEE 754双精度浮点数格式,其中包含52位尾数。一个重要的区别是,np.float64.__repr__
的格式经常使用过多的小数位,以便不会丢失任何位,但在13.949999999999999和13.950000000000001之间不存在有效的IEEE 754数字。结果并不理想,而repr(float(number_as_string))
转换与numpy不可逆。另一方面:float.__repr__
被格式化为每个数字都很重要;序列没有间隔,转换是可逆的。简单地说:如果您可能有一个numpy.float64数字,请将其转换为普通浮点数,以便对人类进行格式化,而不是对数字处理器进行格式化,否则在Python 2.7+中不需要进行其他操作。
float
(双精度)和普通的round
,而不是关于numpy.double及其转换为字符串。在Python 2.7中,普通的Python舍入确实无法做得比这更好了。大多数答案都是在2.7之前编写的,但它们已经过时了,尽管它们最初非常好。这就是我回答的原因。 - hynekcera*b
和 b*a
的区别。感谢提供的链接 -- Nostalgia。 - Rick James请尝试以下代码:
>>> a = 0.99334
>>> a = int((a * 100) + 0.5) / 100.0 # Adding 0.5 rounds it up
>>> print a
0.99
round
函数的不必要重新实现(该函数已在问题中使用)。 - interjayround()
函数不起作用,就需要使用 @interjay
提到的东西。 - Pithikos使用:
float_number = 12.234325335563
round(float_number, 2)
这将返回;
12.23
说明:
round函数接受两个参数:需要四舍五入的数字和保留的小数位数。这里保留了两位小数。