为什么17位及更多位数的数字会自动变为偶数?

use*_*310 3 precision facebook numbers rounding actionscript-3

我正在测试Facebook的照片应用程序.我从Facebook API获取对象ID,但我收到了一些不正确的,这没有意义 - 为什么Facebook会发错ID?我调查了一下,发现有17位以上数字的数字会自动变成偶数!

例如,假设我应该从Facebook收到的ID是12345678912345679.在调试器中,我注意到Flash Player会自动将其转换为12345678912345678.我甚至试图将其手动设置回奇数,但它会不断变回均匀.

有没有办法阻止Flash Player舍入数字?BTW这个变量被定义为Object,我从Facebook那里收到它.

wel*_*rat 11

这与数据类型的实现有关:

  • int 是一个32位数字,具有均匀分布的正负值,包括0.所以最大值是

    (2^32 / 2 ) - 1 == 2,147,483,647.

  • uint也是一个32位数字,但它没有负值.所以最大值是

    2^32 - 1 == 4,294,967,295.

当您使用大于int或的最大值的数值时uint,它会自动转换为Number.来自Adobe Doc:

当您需要使用浮点值时,Number数据类型很有用.Flash运行时比Number更有效地处理int和uint数据类型,但是在所需值范围超过int和uint数据类型的有效范围的情况下,Number非常有用.Number类可用于表示远远超出int和uint数据类型的有效范围的整数值.与int和uint可用的32位相比,Number数据类型最多可以使用53位来表示整数值.

53位的最大值为:

2^53 - 1 == 9,007,199,254,740,989 => 16位数

因此,当您使用任何大于该值的值时,浮点数的内部运算适用.

您可以在这里阅读浮点数,但简而言之,对于任何浮点值,前几位用于指定乘法因子,它决定了点的位置.这允许比实际可能用可用位数表示的更大范围的值 - 以降低的精度为代价.

当您的值大于Number可能具有的最大可能整数值时,最低有效位(表示0和1的位)被截断以允许存在更高有效位(代表2 ^ 54的位)= >因此,你失去了奇数.

有一种简单的方法可以解决这个问题:将所有ID保存为字符串 - 它们可以包含与系统可用字节数一样多的数字;)无论如何,您不太可能使用它们进行任何计算.

顺便说一句,如果你有一个大于的值2^54-(1+2),你的数字将向下舍入到下一个4的倍数; 如果你的值大于2^55-(1+2+4),则它们将向下舍入到8的下一个倍数,等等.