我知道精密错误的奇怪的东西,但我不能理解,
为什么(长)9223372036854665200d给我9223372036854665216?
@R_301_323@
9223372036854665200d是double类型的常量.但是,9223372036854665200不适合双重而不损失精度.双重只有52位的尾数,而有问题的数字需要63位来精确地表示.
最接近的9223372036854665200d的双数是二进制的尾数等于1.1111111111111111111111111111111111111111111110010100,其指数为63(十进制).这个号码是9223372036854665216(称为U).
如果我们将尾数减少到1.1 … 0011,我们得到9223372036854664192(称为L).
原始数字在L和U之间,并且比L更接近于U
最后,如果你认为这个截尾的尾数应该导致一个数字以一堆零结束,你是对的.只有它发生在二进制,而不是十进制:基16中的U是0x7ffffffffffe5000,L是0x7ffffffffffe4c00.