将 str(float(s)) == s

原文标题Will str(float(s)) == s

str(float(s)) == sifs会包含有效的浮点字符串吗? (忽略空格和其他并发症)

背景:

我有一个文本框,用户可以在其中输入浮点数。我将数字存储为afloat,也许将其写入文件并稍后检索。如果我将值写回文本框而不更改它,我希望它与以前完全相同。

我不想要经典0.3 - 0.1 = 0.1999999....之类的浮点“精度”错误。这仅在执行浮点运算后发生,还是会发生在作为十进制字符串输入的浮点数上?

编辑:我不关心精度损失,例如str(float("1.99999999999999999999999999999999999999999")),或丢失指数,例如str(float("1e3")),或格式化诸如str(float("1"))=="1.0"之类的东西。我只想检查像str(float("0.1"))这样的合理值是否会作为奇怪的值返回,这会使用户感到困惑。

原文链接:https://stackoverflow.com//questions/71962263/will-strfloats-s

回复

我来回复
  • Mooshua的头像
    Mooshua 评论

    不。

    例如,考虑1.2e10

    >>> str(float("1.2e10")) 
    '12000000000.0'
    

    或者,

    >>> str(float("1.20000000000000000000000")) 
    '1.2'
    

    这是由于 python 解析和打印浮点数的方式不同。在解析浮点数时,它必须理解各种各样的值,例如科学记数法。但是,将这个浮点数转换为字符串的代码对它最初是如何写入 python 程序的了解为零。并以自己的“理想”方式写出数字。

    我不希望浮点“精度”错误,例如经典的 0.3 – 0.1 = 0.1999999….。是只发生在进行浮点运算之后,还是会发生在作为十进制字符串输入的浮点数上?

    除非您正在开发高度敏感的软件,否则您无需担心这一点。浮点(尤其是 64 位浮点)非常精确,输入的值(例如 1.2345678910111213)将始终为 ‘close足够了”,除非您使用的数字超过十四位数(很多)。

    TL;DR:除非你能保证s来自str,否则你不能保证str(float(s))会等于s。尽管如此,您可能无论如何都不需要检查这样的事情,因为浮点数几乎总是“足够好”。

    2年前 0条评论