首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将浮点数转换为字符串而不对其进行舍入

将浮点数转换为字符串而不对其进行舍入
EN

Stack Overflow用户
提问于 2009-08-23 02:03:08
回答 4查看 454.8K关注 0票数 89

我正在编写一个程序,由于不需要解释的原因,它需要将一个浮点数转换为一个字符串,然后使用len()进行计数。但是,str(float(x))会导致x在转换为字符串时进行四舍五入,这会抛出整个字符串。有没有人知道解决它的办法?如果你想知道,下面是使用的代码:

代码语言:javascript
复制
len(str(float(x)/3))
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-08-23 02:10:14

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

例如:

代码语言:javascript
复制
>>> .1
0.10000000000000001

在本例中,您将看到使用repr将.1转换为字符串

代码语言:javascript
复制
>>> repr(.1)
'0.10000000000000001'

我相信当您使用str()来解决这个问题时,python会去掉最后几位数字,但这只是一个局部的解决方法,并不能代替理解发生了什么。

代码语言:javascript
复制
>>> str(.1)
'0.1'

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

例如:

代码语言:javascript
复制
>>> '%.5f' % .1
'0.10000'
>>> '%.5f' % .12345678
'0.12346'

Documentation here

票数 130
EN

Stack Overflow用户

发布于 2009-08-23 02:05:19

代码语言:javascript
复制
len(repr(float(x)/3))

然而,我必须说,这并不像你想的那样可靠。

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

代码语言:javascript
复制
>>> print len(repr(0.1))
19
>>> print repr(0.1)
0.10000000000000001

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

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

代码语言:javascript
复制
>>> print len(str(decimal.Decimal('0.1')))
3
票数 12
EN

Stack Overflow用户

发布于 2009-08-23 10:09:22

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

由于你的问题没有给出足够的上下文,我不知道十进制模块是否能满足你的需求:

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

在其他方面,您可以显式指定您希望获得的精度(从文档中):

代码语言:javascript
复制
>>> 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)中的一个简单示例:

代码语言:javascript
复制
>>> 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中增加了decimal,并在python 2.6中添加了小数。

希望这对你有帮助,弗朗西斯科

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1317558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档