为什么在处理大于 Long.MAX_Value 的整数时会使用 BigInteger 而不是 double 之类的东西?

Why would one use BigInteger over something like a double when dealing with integers larger than Long.MAX_Value?

当处理大于 Long.MAX_VALUE 的整数时,为什么有人应该使用 BigInteger 对象而不是 double? long 的最大值是 2^63 - 1,而 double 的最大值是 ~1.7*10^308。将 double 用作整数而不是为该数字创建整个对象会不会更容易并使用更少的资源?

浮点数(浮点数、双精度数)通过牺牲精度来扩大范围。它们分别将一个值表示为指数分量和尾数分量:

2^E * M

一个浮点数可以表示的离散值只有这么多,并且随着您接近最大可能值,它们之间的间距会变大。因此,对于大多数数字来说,存在 小程度的误差,随着数字变大,误差也会变大。

举个极端的例子,1000000000000000000000000000000存储为单精度浮点数时变成1000000000000000019884624838656。如果你想数数,这就不好了——尤其是当你发现 1e+30 + 10 = 1e+30!

这就是 BigInteger 的用武之地。它提供任意大的整数而没有舍入误差。

通常,从不使用浮点值进行计数。浮点数之间的比较要求您为舍入误差提供一些空间,而整数之间的比较则完全精确。