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

我正在做一个程序,由于不需要解释的原因,需要将一个浮点数转换为字符串,以便用len()计算。然而,str(float(x))的结果是x在转换为字符串时被四舍五入,这让整个事情变得很麻烦。有人知道如何解决这个问题吗? 如果你想知道,这里是正在使用的代码。

len(str(float(x)/3))
解决办法

在处理浮点数的时候,某种形式的四舍五入往往是不可避免的。 这是因为你可以用基数10精确表达的数字不可能总是用基数2(你的计算机使用的)精确表达。

比如说。

>>> .1
0.10000000000000001

在这种情况下,你看到的是用repr将.1转换为一个字符串。

>>> repr(.1)
'0.10000000000000001'

我相信,为了解决这个问题,当你使用str()时,python会把最后的几个数字切掉,但这只是一个局部的解决方法,并不能代替对事情的理解。

>>> str(.1)
'0.1'

我不确定四舍五入到底给你带来了什么问题。 也许你可以用字符串格式化的方法来更精确地控制你的输出,这样会更好?

比如说。

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

文件在此

评论(0)
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
评论(1)

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

由于你在问题中没有给出足够的背景,我无法知道小数模块是否能满足你的需求。

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

也许这可以帮助你? decimal从2.4开始在Python stdlib中出现,在Python 2.6中增加了。

希望这能有所帮助。 弗朗西斯科

评论(0)