89

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

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

4 回答 4

130

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

例如:

>>> .1
0.10000000000000001

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

>>> repr(.1)
'0.10000000000000001'

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

>>> str(.1)
'0.1'

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

例如

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

文档在这里

于 2009-08-23T02:10:13.680 回答
12
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
于 2009-08-23T02:05:19.180 回答
4

Other answers already pointed out that the representation of floating numbers is a thorny issue, to say the least.

Since you don't give enough context in your question, I cannot know if the decimal module can be useful for your needs:

http://docs.python.org/library/decimal.html

Among other things you can explicitly specify the precision that you wish to obtain (from the docs):

>>> 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')

A simple example from my prompt (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

Maybe this can help? decimal is in python stdlib since 2.4, with additions in python 2.6.

Hope this helps, Francesco

于 2009-08-23T10:09:22.450 回答
0

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

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

输出是

1.0,data/2.jpg

您可以根据自己的方便修改此格式示例。

于 2018-07-17T14:48:51.627 回答