是一個真正的64位有符號整數的MongoDB的NumberLong真的64位?MongoDB的NumberLong只有54位簽名?
MongoDB的NumberLong被認爲是一個64位有符號整數,這意味着我們可以使用-2^63來玩< = x < = 2^63-1,其中x是一個NumberLong。 但是,從NumberLong(x)中加1或減1不會返回期望值x < = -2^54或x> = 2^54,但返回的正確值爲-2^53 < = x < = 2^53。
可靠的NumberLong數字似乎是54位有符號整數。
這是爲什麼?
我做錯了什麼?從蒙戈外殼
樣品:
> NumberLong(Math.pow(2,54))
NumberLong("18014398509481984") // Expected
> NumberLong(Math.pow(2,54)-1)
NumberLong("18014398509481984") // **NOT** Expected
> NumberLong(-Math.pow(2,54))
NumberLong("-18014398509481984") // Expected
> NumberLong(-Math.pow(2,54)+1)
NumberLong("-18014398509481984") // **NOT** Expected
> NumberLong(Math.pow(2,53))
NumberLong("9007199254740992") // Expected
> NumberLong(Math.pow(2,53)-1)
NumberLong("9007199254740991") // Expected
> NumberLong(-Math.pow(2,53))
NumberLong("-9007199254740992") // Expected
> NumberLong(-Math.pow(2,53)+1)
NumberLong("-9007199254740991") // Expected
使用MongoDB的2.0.0
你對浮子尾數的想法會解釋一切。不幸的是,左移整數僅適用於32位有符號,並且重複的乘法給出了與上述相同的輸出。 – fsto