我知道一些带有精度错误的怪异事物,但我无法理解,
为什么(long)9223372036854665200d
给我9223372036854665216
?
最佳答案
9223372036854665200d
是double
类型的常量。但是,在不损失精度的情况下,9223372036854665200
不适合double
。 double
仅具有52位尾数,而所讨论的数字需要63位才能精确表示。
最接近double
的9223372036854665200d
是尾数等于二进制形式的1.1111111111111111111111111111111111111111111110010100
且指数为63(十进制)的数字。这个数字就是9223372036854665216
(称为U
)。
如果将尾数减少一个刻痕到1.1...0011
,我们将得到9223372036854664192
(称为L
)。
原始数字在L
和U
之间,并且比U
更接近L
最后,如果您认为尾数的这种截断应该导致数字以一串零结尾,那么您是对的。它仅以二进制而不是十进制出现:base-16中的U
是0x7ffffffffffe5000
,而L
是0x7ffffffffffe4c00
。
关于java - 为什么(long)9223372036854665200d给我9223372036854665216?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7811112/