相反,添加了(确定性但无意义的)数据(如您在代码示例中演示的那样)。您不会丢失任何信息。但它的价值不一样。
您float
的精度约为 17 位小数,您int
的精度突然达到 51 位。这与Floating Point Arithmetic: Issues and Limitations相关。这种“精度”是十进制浮点值的二进制表示的结果,这导致了整数中一系列数字的“发明”。
考虑以下情况(在 Python 中,它遵循相同的规则,可能所有具有任意长整数的编程语言都如此):
>>> a = int(1.5815450433041317e+51)
>>> a
1581545043304131697954259018410479150921451567054848
>>> b = a + 10000000000000000
>>> a == b
False
>>> float(a) == float(b)
True
>>> a == 1.5815450433041317e+51
True
在 Python 中,该decimal
模块将是一个很好的折衷方案:
>>> from decimal import Decimal, getcontext
>>> a = str(29873409852730498572309485723**3) # just an arbitrary number
>>> getcontext().prec = 100
>>> cube = Decimal(a)
>>> cube ** Decimal("0.333333333333333333333333333333333333333333333333333333333
33333333333333333333")
Decimal('29873409852730498572309485722.99999999999999999999999999999999999999999
999998041297117811390088120595')
(由于表示1/3
为十进制浮点数的问题,仍然有轻微的舍入误差,但结果很明显,不是吗?)