java – 为什么(长)9223372036854665200d给我9223372036854665216?

前端之家收集整理的这篇文章主要介绍了java – 为什么(长)9223372036854665200d给我9223372036854665216?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我知道精密错误的奇怪的东西,但我不能理解,

为什么(长)9223372036854665200d给我9223372036854665216?

解决方法

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.

猜你在找的Java相关文章