从字符串读取浮点数

2 投票
4 回答
2955 浏览
提问于 2025-04-15 14:30

我有一个简单的字符串,想把它转换成浮点数,但不想丢失任何可见的信息,下面是我的例子:

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;你必须传一个字符串(或者一个整数)给构造函数。

撰写回答