我正在测试Facebook的照片应用程序。我从Facebook API获取对象ID,但我收到了一些不正确的,这没有意义 - 为什么Facebook会发错ID?我调查了一下,发现有17位以上的数字会自动变成偶数!
例如,假设我应该从Facebook收到的ID是12345678912345679
。在调试器中,我注意到Flash Player会自动将其转换为12345678912345678
。我甚至试图将其手动设置回奇数,但它会不断变回均匀。
有没有办法阻止Flash Player舍入数字? BTW变量定义为Object
,我从Facebook收到它。
答案 0 :(得分:11)
这与数据类型的实现有关:
int
是一个32位数字,具有均匀分布的正数和
负值,包括0.所以最大值是
(2^32 / 2 ) - 1 == 2,147,483,647
。
uint
也是一个32位数字,但它没有负值。所以
最大值是
2^32 - 1 == 4,294,967,295
。
当您使用的数值大于int
或uint
的最大值时,它会自动转换为Number
。 From 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的倍数,等等。