注册
 找回密码
 注册
江西广告网
查看: 319|回复: 0
打印 上一主题 下一主题

AS计算方面的错误

[复制链接]

该用户从未签到

1
跳转到指定楼层
发表于 2009-3-17 08:05:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
AS在计算方面会有小小的偏差,而这份偏差可能会导致很多问题。那么通常出现的问题有哪几种呢?这里我把本身遇到和其他以前看过的凑起来 第一种 var a=(1/3); trace(a); // 输出 0.333333333333333 trace(a*3); // 输出 1 到这里为止的计算没有问题,那么接下来看看所出现的问题 var b=a.toString(); //把a转换为文字 var c=Number(b); //再把文字转换为数字 trace(c); // 输出 0.333333333333333 trace(c*3); // 输出 0.999999999999999 看看问题是不是出现了呢?0.99999999999999并不是我们的准确答案,这通常会发生在制作计算器(calculator)时会出现 第二种 var b = (4/3)-0.333333333333333; var e = Number(String(b)); trace(b); //输出 1 trace(e); //输出文字转换数字 1 trace(String(b) == String(e)); //文字比较为 true trace(b == e); // 数字比较为 false; trace(b-e); //输出 2.22044604925031e-16 同上都是数字转换文字后再转换为数字的问题,解决方法是不要自己定义小数 var a = 1/3; //改用变量 var b = (4/3)-a; var e = Number(b.toString()); trace(b); //输出 1 trace(e); //输出文字转换数字 1 trace(b.toString() == e.toString()); //文字比较为 true trace(b == e); // 数字比较为 true; trace(b-e); //输出 0第三种 var a=10; var b=Math.sqrt(a)*Math.sqrt(a); trace(b);// 输出变量b为 10 trace(b==10); // 比较的时候却是 false; 这类复杂的计算容易出错 第四种 var a=1000*Math.PI/180; var b=(Math.PI/180)*1000; trace(a);// 输出 17.4532925199433 trace(b);// 输出 17.4532925199433 trace(a==b); //比较为 false trace(a-b); //输出 -3.5527136788005e-15 在角度和弧度转换时的错误,最好角度值不要太大。角度在360内是绝对没有问题的 第五种 var a=(99.9-0.1); trace(a==99.8);// 输出 false这类比较严重,所以尽量避免使用。如果是非要这样判断的话,就把a转换为文字后比较才可以解决 第六种 var a = 10; for (var i = 0; i<20; i ) { a -= 0.1; trace(a); }输出为 9.9 9.8 9.7 9.6 9.5 9.4 9.3 9.2 9.1 9 8.9 8.8 8.7 8.6 8.50000000000001 8.40000000000001 8.30000000000001 8.20000000000001 8.10000000000001 8.00000000000001第七种 for (var i =-1; i<1; i =0.1) { trace(i); } 输出为 -1 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 -1.38777878078145e-16 0.0999999999999999 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1第八种 var a = 9999999999; a = 0.000005; trace(a);//9999999999.00001 大数目与小数点相加的错误 以上都是大家常会犯上的错误,逻辑上是没错但却又找不到问题所在。所以要以Flash做大量的计算的话还是需要考虑清楚
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表