与 LargeNumber ** 1 和 1.0 的 Python3 不同结果

问题描述

largenumber = 821424692950225218
largenumber ** 1 = 821424692950225218
largenumber ** 1.0 = 8.214246929502253e+17
int(largenumber**1.0) = 821424692950225280

为什么结果不同?

解决方法

浮点数的存在迫使操作在具有 limited precision 的浮点上下文中执行。另一方面,在所有参数都是整数的情况下,Python 让 ** 保留在整数域中,其精度仅受可用内存的限制。一旦结果为浮点数,转换为 int 将无法恢复丢弃的信息。

tl;dr:largenumber ** 1.0 等价于 float(largenumber)