将一个浮点数转换为一个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中增加了。
希望这有助于弗朗切斯科