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

91 投票
4 回答
464456 浏览
提问于 2025-04-15 13:48

我正在写一个程序,出于一些不需要解释的原因,我需要把一个浮点数转换成字符串,然后用len()来计算它的长度。但是,使用str(float(x))转换成字符串时,浮点数会被四舍五入,这样就搞乱了整个程序。有没有人知道怎么解决这个问题?如果你想知道,我这里有正在使用的代码:

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

4 个回答

4

其他回答已经指出,浮点数的表示方式确实是个棘手的问题,至少可以这么说。

因为你在问题中没有提供足够的背景信息,所以我不知道你是否需要用到decimal模块:

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模块从python 2.4开始就已经在标准库中,2.6版本有了一些新增功能。

希望这能帮到你,
Francesco

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
131

在处理浮点数时,某种形式的四舍五入通常是不可避免的。这是因为在十进制中能准确表示的数字,在计算机使用的二进制中不一定能准确表示。

举个例子:

>>> .1
0.10000000000000001

在这个例子中,你可以看到 .1 是如何通过 repr 转换成字符串的:

>>> repr(.1)
'0.10000000000000001'

我认为,当你使用 str() 时,Python 会截掉最后几位数字,以解决这个问题,但这只是部分解决办法,并不能替代对问题本质的理解。

>>> str(.1)
'0.1'

我不太确定“舍入”给你带来了什么具体问题。也许你可以尝试使用字符串格式化,这样可以更精确地控制你的输出?

例如:

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

这里有相关文档.

撰写回答