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的下一个倍数,等等.
归档时间: |
|
查看次数: |
783 次 |
最近记录: |