我知道一些带有精度错误的怪异事物,但我无法理解,

为什么(long)9223372036854665200d给我9223372036854665216

最佳答案

9223372036854665200ddouble类型的常量。但是,在不损失精度的情况下,9223372036854665200不适合doubledouble仅具有52位尾数,而所讨论的数字需要63位才能精确表示。

最接近double9223372036854665200d是尾数等于二进制形式的1.1111111111111111111111111111111111111111111110010100且指数为63(十进制)的数字。这个数字就是9223372036854665216(称为U)。

如果将尾数减少一个刻痕到1.1...0011,我们将得到9223372036854664192(称为L)。

原始数字在LU之间,并且比U更接近L
最后,如果您认为尾数的这种截断应该导致数字以一串零结尾,那么您是对的。它仅以二进制而不是十进制出现:base-16中的U0x7ffffffffffe5000,而L0x7ffffffffffe4c00

关于java - 为什么(long)9223372036854665200d给我9223372036854665216?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7811112/

10-11 05:33