将浮点数转换为字符串而不四舍五入

91

我正在编写一个程序,由于某些原因需要将一个浮点数转换成字符串来计算其长度。然而,使用str(float(x))将会导致x被四舍五入,从而使整个计算结果失准。请问有没有办法解决这个问题?以下是代码:

len(str(float(x)/3))

2
如果x最初是str类型,为什么需要强制转换? - Vinko Vrsalovic
1
-1:没有给出不同x值的所需输出的示例。没有示例,我们只能猜测问题所在。 - S.Lott
参见:浮点数运算是否存在问题? - Karl Knechtel
4个回答

131

在处理浮点数时,往往无法避免某种形式的四舍五入。这是因为你可以用十进制精确表示的数字,并不总能在二进制中精确表示(计算机使用的是二进制)。

例如:

>>> .1
0.10000000000000001
在这种情况下,您看到使用repr将.1转换为字符串:
>>> repr(.1)
'0.10000000000000001'

我相信在使用str()时,Python会截断最后几位数字以解决这个问题,但这只是部分解决方法,并不能替代理解发生了什么。

>>> str(.1)
'0.1'

我不确定“四舍五入”给你带来了哪些问题。也许使用字符串格式化可以更精确地控制输出?

例如:

>>> '%.5f' % .1
'0.10000'
>>> '%.5f' % .12345678
'0.12346'

这里有文档.


12
len(repr(float(x)/3))

但我必须说,这并不像你想象的那样可靠。

浮点数被输入/显示为十进制数,但是您的计算机(实际上是您的标准C库)将它们存储为二进制。由此产生了一些副作用:

>>> print len(repr(0.1))
19
>>> print repr(0.1)
0.10000000000000001

为什么会发生这种情况的解释在Python教程的这一章节中。

一种解决方法是使用专门跟踪十进制数字的类型,例如Python的decimal.Decimal

>>> print len(str(decimal.Decimal('0.1')))
3

关于如何处理除法得到的浮点数结果的好帖子:https://dev59.com/8nA85IYBdhLWcg3wD_O8 - Trutane

4

其他答案已经指出,浮点数的表示是一个棘手的问题,至少可以这么说。

由于你没有在问题中提供足够的上下文,我不知道 decimal 模块是否可以满足您的需求:

http://docs.python.org/library/decimal.html

除其他外,您可以显式地指定您希望获得的精度(来自文档):

>>> getcontext().prec = 6
>>> Decimal('3.0')
Decimal('3.0')
>>> Decimal('3.1415926535')
Decimal('3.1415926535')
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85987')
>>> getcontext().rounding = ROUND_UP
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85988')

以下是一个简单的例子(使用python 2.6):

>>> import decimal
>>> a = decimal.Decimal('10.000000001')
>>> a
Decimal('10.000000001')
>>> print a
10.000000001
>>> b = decimal.Decimal('10.00000000000000000000000000900000002')
>>> print b
10.00000000000000000000000000900000002
>>> print str(b)
10.00000000000000000000000000900000002
>>> len(str(b/decimal.Decimal('3.0')))
29

也许这可以帮到您? 自Python 2.4起,十进制数已经包含在Python标准库中,并在Python 2.6中进行了补充。
希望这可以帮助您, 弗朗西斯科

0

我知道现在已经晚了,但是对于第一次来这里的人,我想发布一个解决方案。我有一个浮点数值 index 和一个字符串 imgfile,我遇到了和你同样的问题。这就是我如何解决这个问题的方法:

index = 1.0
imgfile = 'data/2.jpg'
out = '%.1f,%s' % (index,imgfile)
print out

输出结果为

1.0,data/2.jpg

您可以根据自己的需要修改此格式示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接