将 str(float(s)) == s
原文标题 :Will str(float(s)) == s
str(float(s)) == s
ifs
会包含有效的浮点字符串吗? (忽略空格和其他并发症)
背景:
我有一个文本框,用户可以在其中输入浮点数。我将数字存储为afloat
,也许将其写入文件并稍后检索。如果我将值写回文本框而不更改它,我希望它与以前完全相同。
我不想要经典0.3 - 0.1 = 0.1999999....
之类的浮点“精度”错误。这仅在执行浮点运算后发生,还是会发生在作为十进制字符串输入的浮点数上?
编辑:我不关心精度损失,例如str(float("1.99999999999999999999999999999999999999999"))
,或丢失指数,例如str(float("1e3"))
,或格式化诸如str(float("1"))=="1.0"
之类的东西。我只想检查像str(float("0.1"))
这样的合理值是否会作为奇怪的值返回,这会使用户感到困惑。
回复
我来回复-
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年前