【发布时间】:2017-07-19 15:10:49
【问题描述】:
这不是this的重复,我会在这里解释。
考虑x = 1.2。我想把它分成1 和0.2。我已经尝试了链接问题中概述的所有这些方法:
In [370]: x = 1.2
In [371]: divmod(x, 1)
Out[371]: (1.0, 0.19999999999999996)
In [372]: math.modf(x)
Out[372]: (0.19999999999999996, 1.0)
In [373]: x - int(x)
Out[373]: 0.19999999999999996
In [374]: x - int(str(x).split('.')[0])
Out[374]: 0.19999999999999996
我尝试的任何东西都没有给我准确的1 和0.2。
有没有什么方法可以可靠地将浮点数转换为其十进制和浮点等价物,而不受浮点表示的限制?
我知道这可能是由于数字本身存储方式的限制,所以我愿意接受任何可以克服这个问题的建议(如包裹或其他)。
编辑:希望采用不涉及字符串操作的方式,如果可能。
【问题讨论】:
-
但
1.2无法正确表示。它只是像1.2这样写的格式。事实上号码是1.19999....。 -
@WillemVanOnsem 我愿意接受任何让这成为可能的事情......也许是一个新的python包:)
-
当然有一些包允许使用十进制数格式执行计算,或者可以懒惰地工作,因此可以以任意精度进行评估,等等。但是 python 浮点数根据 IEEE-574 规范工作。而
0.2无法以这种格式精确表示。 -
@WillemVanOnsem 是的...欢迎提出建议!
-
@cᴏʟᴅsᴘᴇᴇᴅ 那么问题就不明确了。您是否仍希望能够将小数部分与此数字完全分开: 1.23456789 ?请注意,数字的整数部分越大,其小数部分的不准确性就越多。
标签: python floating-point ieee-754 python-internals