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


88

我正在编写一个程序,出于不需要解释的原因,该程序要求将float转换为要用len()计算的字符串。但是,str(float(x))导致x在转换为字符串时被四舍五入,从而使整个过程丢掉。有人知道它的修复程序吗?如果您想知道以下代码,请使用以下代码:

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

2
如果x最初是str,为什么要强制转换?
Vinko Vrsalovic

1
-1:没有示例提供不同值所需的输出x。没有示例,我们只能猜测问题出在哪里。
S.Lott

Answers:


129

在处理浮点数时,通常不可避免地需要某种形式的舍入。这是因为您可以以10为基数精确表示的数字不能始终以2为基数(您的计算机使用)精确表示。

例如:

>>> .1
0.10000000000000001

在这种情况下,您会看到使用.1将.1转换为字符串repr

>>> 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's decimal.Decimal

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

关于如何使用浮点数的好帖子来自除法:stackoverflow.com/questions/2958684/python-division
Trutane

3

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

由于您在问题中提供的上下文不足,因此我不知道十进制模块是否可以满足您的需求:

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

也许这可以帮助?从2.4开始,十进制就在python stdlib中,而在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

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

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.