扩展AS3的数据范围和精度

AS3目前提供的数值类型仅有int,uint,Number三种,int的有效取值范围是-2^31 ~ 2^31-1(-2147483648~2147483647),uint表示无符号的整形,有效取值范围是 0~2^32-1(0~4294967295),在Adobe的官方说明中对Number的表述是:“Number数据类型可以表示整数、无符号整数和浮 点数。”为了尽可能提高性能,应将Number数据类型仅用于浮点数,或者用于表示int和uint类型无法存储的、大于32位的整数值。虽然 Number可以表示64位双精度的数值,但是精度范围却只有52位,因此无论 是在表示52以上的整形还是对精度要求很高的十进制小数和乘除都显得力不从心。近来遇到一个项目,要与C++编写的Socket服务器进行通讯,服务器端 的数据验证使用了C++中的int64类型的数值,在AS中使用Number可以表示这些整数,但由于精度不足,有很大的误差,深入了解了Number:
◆Number数据类型使用由IEEE二进制浮点算术标准(IEEE-754)指定的64位双精度格式。此标准规定如何使用64个可用位来存储浮点数。其 中的1位用来指定数字是正数还是负数。11位用于指数,它以二进制的形式存储。其余的52位用于存储"有效位数"(又称为"尾数"),有效位数是2 的N次幂,N即前面所提到的指数。
可以将Number数据类型的所有位都用于有效位数,也可以将Number数据类型的某些位用于存储指数,后者可存储的浮点数比前者大得多。例如,如果 Number数据类型使用全部64位来存储有效位数,则它可以存储的最大数字为265-1。如果使用其中的11位来存储指数,则Number数据类型可以 存储的最大有效数字为21023。

◆Number类型可以表示的最小值和最大值存储在Number类的名为Number.MAX_VALUE和Number.MIN_VALUE的静态属性中。
Number.MAX_VALUE==1.79769313486231e+308Number.MIN_VALUE==4.940656458412467e- 324尽管这个数字范围很大,但代价是此范围的精度有所降低。Number数据类型使用52位来存储有效位数,因此,那些要求用52位以上的位数才能精确 表示的数字(如分数1/3)将只是近似值。如果应用程序要求小数达到绝对精度,则需要使用实现小数浮点算术(而非二进制浮点算术)的软件。
如果用Number数据类型来存储整数值,则仅使用52位有效位数。Number数据类型使用52位和一个特殊的隐藏位来表示介于-9,007,199,254,740,992(-253)和9,007,199,254,740,992(253)之间的整数。

为了解决我的问题,在Google code上一翻狂搜,终于在一个Ajax的开源数据服务框架(graniteds-2.2.0.RC2)中找到了适用于AS的数据精度解决方案,提供了4 种扩展的数值类型:Long,BigInteger,BigNumber,BigDecimal,从字面意思就可以了解到他们的作用了.经过使用发现完美 地解决了Number类型精度不足的问题,且效率也比较高.
可以在Google code上下载 此扩展包.扩展的数值类型在graniteds/as3/framework/org/granite/math目录.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值