将float转换为字符串而不对其进行舍入

时间:2009-08-23 02:03:08

标签: python string floating-point rounding

我正在创建一个程序,由于不需要解释的原因,需要将float转换为字符串以使用len()进行计数。但是,str(float(x))导致x在转换为字符串时被舍入,这会抛出整个事物。有谁知道它的修复? 如果你想知道,这是使用的代码:

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

4 个答案:

答案 0 :(得分:119)

在处理浮点数时,某些形式的舍入通常是不可避免的。这是因为您可以在基数10中准确表达的数字不能总是在基数2(您的计算机使用)中完全表达。

例如:

>>> .1
0.10000000000000001

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

>>> repr(.1)
'0.10000000000000001'

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

>>> str(.1)
'0.1'

我不确定“舍入”究竟是什么问题导致了你。也许你会更好地使用字符串格式化来更精确地控制输出?

e.g。

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

Documentation here

答案 1 :(得分:11)

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

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

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

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

关于为什么会发生这种情况的解释是在python教程的this chapter中。

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

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

答案 2 :(得分: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以来,decimal在python stdlib中,在python 2.6中添加了。

希望这有帮助, 弗朗西斯

答案 3 :(得分:0)

我知道这为时已晚,但是对于那些第一次来这里的人,我想发布一个解决方案。我有一个浮点值index和一个字符串imgfile,与您有同样的问题。这就是我解决问题的方式

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

输出为

1.0,data/2.jpg

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