从字符串读取浮点数
我有一个简单的字符串,想把它转换成浮点数,但不想丢失任何可见的信息,下面是我的例子:
s = ' 1.0000\n'
当我用 f = float(s)
这样做时,我得到 f=1.0
我该怎么做才能得到 f=1.0000
呢?
谢谢
4 个回答
1
这是一个更炫酷的版本,基于@Simon Edwards的ExactFloat
,它可以计算小数点后有多少位数字,并在把这个数字转换成字符串时显示出相应的位数。
import re
class ExactFloat(float):
def __init__(self, str_value):
float.__init__(self, str_value)
mo = re.match("^\d+\.(\d+)", str_value)
self.digits_after_period = len(mo.group(1))
def __repr__(self):
return '%.*f' % (self.digits_after_period, self)
def __str__(self):
return self.__repr__()
print ExactFloat("1.000")
print ExactFloat("1.0")
print ExactFloat("23.234500")
举个例子:
$ python exactfloat.py
1.000
1.0
23.234500
5
>>> 1.0 == 1.00 == 1.000
True
换句话说,你并没有丢失任何信息——Python 在处理浮点数时,认为小数部分后面的零是不重要的。如果你需要特别关注“有效数字的数量”,这也是可以做到的,但你需要告诉我们你具体想要实现什么,超出了 Python 的普通 float
的范围(比如,Python 标准库里的 decimal
是否与此有关?等等等等...)。
9
直接回答: 你不能这样做。浮点数本身就是不精确的,这是它的设计特点。虽然Python的浮点数可以表示得很精确,比如1.0000,但它永远不会表示成“1.00000”。通常来说,这样的精度已经足够了。如果你需要显示四位小数,可以使用字符串格式化。
print '%.3f' % float(1.0000)
间接回答: 使用decimal
模块。
from decimal import Decimal
d = Decimal('1.0000')
decimal
包是专门用来处理这些精度问题的,它可以做到任意精度。一个十进制的“1.0000”就是完全等于1.0000,没有多也没有少。不过要注意,由于四舍五入的问题,你不能直接把一个float
转换成Decimal
;你必须传一个字符串(或者一个整数)给构造函数。