Actionscript 3 as3数字类型-大数字的逻辑问题

Actionscript 3 as3数字类型-大数字的逻辑问题,actionscript-3,Actionscript 3,我对我们团队中发现的一个问题感到好奇,这个问题的人数非常多: var n:Number = 64336512942563914; trace(n < Number.MAX_VALUE); // true trace(n); // 64336512942563910 var a1:Number = n +4; var a2:Number = a1 - n; trace(a2); // 8 Expect to see 4 trace(n + 4 - n); // 8 var a3:Num

我对我们团队中发现的一个问题感到好奇,这个问题的人数非常多:

var n:Number = 64336512942563914;
trace(n < Number.MAX_VALUE); // true
trace(n); // 64336512942563910

var a1:Number = n +4;
var a2:Number = a1 - n;
trace(a2); // 8  Expect to see 4
trace(n + 4 - n); // 8

var a3:Number = parseInt("64336512942563914");
trace(a3); // 64336512942563920

n++;
trace(n); //64336512942563910
trace(64336512942563914 == 64336512942563910); // true
变量n:Number=64336512942563914; 跟踪(n 这是怎么回事

虽然
n
很大,但它比
Number.MAX\u VALUE
小,所以为什么我会看到这种奇怪的行为

我认为当
跟踪时,可能是格式化大数字的问题,但这并不能解释
n+4-n==8


这是一个奇怪的浮点数问题吗?

这确实是一个浮点数近似问题

我猜n与4相比太大了,所以它必须与同龄的孩子保持一致:
跟踪(n-n+4)
是正常的,因为它没有n-n=0;0 + 4 = 4;

实际上,
Number
不是用于大整数的类型,而是浮点数。如果要计算大整数,必须保持在
uint.MAX\u值的限制范围内


干杯

是的,这是一个浮点问题,但不是一个奇怪的问题。这都是预期的行为

AS3中的数字数据类型实际上是“IEEE二进制浮点算法标准(IEEE-754)规定的64位双精度格式”()。因为分配给n的数字太多,无法放入64位,所以会四舍五入,这就是所有“奇怪”结果的原因


如果需要执行一些精确的大整数运算,则必须使用自定义的大整数类,例如,..

flash中的数字是双精度浮点数字。这意味着它们存储了大量有效数字和指数。由于内存限制,与数字精度相比,它更倾向于更大范围的可表达数字。在某些情况下,如果数字有很多有效数字,就会出现舍入。这就是你所看到的;正在对最低有效数字进行四舍五入。谷歌双精度浮点数,你会发现一堆技术信息为什么


这是数据类型的本质。如果你需要精确的数字,你应该坚持使用uint或基于int的整数。其他语言有定点或bigint数字处理库(有时称为bigint或Decimal),它们是整数的包装器,渴望以内存消耗为代价来表达更大的数字。

我们有一个从Java复制的bigdecim as3实现,用于所有计算。在交易应用程序中,浮点错误是不可接受的。

为了安全起见,在使用数字时使用整数数学,我检查了数字,它表示:

Number类可用于表示远远超过 int和uint数据类型的有效范围。数字数据类型 与32位相比,最多可使用53位表示整数值 可用于int和uint的位

如果我没弄错的话,一个53位的整数可以得到2^53-1,它是9007199254740991,或者大约9万亿。其他11位帮助组成64位数字,用于指数中。问题中使用的数字约为643万亿。超过该点(9万亿)需要比分配的有效数字部分(尾数)更多的位,因此发生舍入。一个有用的解释为什么这是有意义的(由PBS工作室的无限系列)


所以,是的,我们必须搜索外部资源,比如BigInt。希望我链接的资源对某些人有用。

我在尝试从java服务返回一些64位整数到as3客户端时遇到了一些困难。多亏了你的帖子,我现在明白了。这只是AS3实际上有多糟糕的另一个例子。