将一个浮点数转换为一个string,而不是四舍五入

我正在做一个程序,由于不需要解释的原因,需要一个浮点数被转换成一个string来计算len()。 但是,str(float(x))导致x在被转换为string时被舍入,从而抛出整个事情。 有谁知道它的修复? 这里是使用的代码,如果你想知道:

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

处理浮点数时,某种forms的舍入通常是不可避免的。 这是因为您可以精确地以10为底数表示的数字不能总是以2为底(您的计算机使用的)来表示。

例如:

 >>> .1 0.10000000000000001 

在这种情况下,您将看到.1使用repr转换为string:

 >>> repr(.1) '0.10000000000000001' 

我相信当你使用str()来解决这个问题的时候,python会删掉最后的几位数字,但是这是一个部分的解决方法,并不能代替理解正在发生的事情。

 >>> str(.1) '0.1' 

我不确定到底是什么问题“舍入”引起你的。 也许你会更好地使用string格式来更精确地控制你的输出。

例如

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

文档在这里 。

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

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

浮点数被input/显示为十进制数,但是您的计算机(实际上是您的标准C库)将它们存储为二进制数。 你会从这个转变中获得一些副作用:

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

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

解决方法是使用专门跟踪十进制数的types,如python的decimal.Decimal

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

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

既然你没有给你的问题足够的上下文,我不知道如果十进制模块可以为您的需要有用:

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中增加了。

希望这有助于弗朗切斯科