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

时间:2012-02-22 23:31:28

标签: facebook actionscript-3 numbers rounding precision

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

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

有没有办法阻止Flash Player舍入数字? BTW变量定义为Object,我从Facebook收到它。

1 个答案:

答案 0 :(得分:11)

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

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

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

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

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

当您使用的数值大于intuint的最大值时,它会自动转换为NumberFrom the Adobe Doc

  

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

53位的最大值为:

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

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

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

如果您的值大于Number可能具有的最大可能整数值,则最低有效位(表示0和1的位)被切断以允许更高位(表示2的位) ^ 54)存在=>因此,你会失去奇数。

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

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