看下面代码运行结果:

trace(256.08+123.1);       //379.17999999999995
trace(256.08-123.11); //132.96999999999997
trace(8.4*0.112); //0.9408000000000001

AS3的Number与JAVA或C++的double类似,采用二进制分数而非十进制分数保存浮点部分,因此会导致不够精确。这是语言的设计思路所致。当然,从另一个思路看,实际上它就是个BUG。

为了必须定需求,只好曲线救国:

/**
* 解决计算Number数据不精确问题
* @param n1 值1
* @param n2 值2
* @param operation 运算符 (+ - * )除法应该不存在这个问题;
*/
function numberCalculate(n1:Number,n2:Number,operation:String):Number
{
var len1:int = getNumberFixed(n1);
var len2:int = getNumberFixed(n2);
var len:int = Math.max(len1,len2);
var s:String = "1";
for (var i:int = 0; i<len; i++)
{
s += "0";
}
var level:int = int(s);
var result:Number;
switch (operation)
{
case "+" :
result = (n1*level+n2*level)/level;
break;
case "-" :
result = (n1*level-n2*level)/level;
break;
case "*" :
result = ((n1*level)*(n2*level))/(level*level);
break;
}
return result;
}
/**
* 获取Number数值的小数位数
* return int
*/
function getNumberFixed(n:Number):int
{
var s:Array = n.toString().split(".");
if (s.length == 2)
{
return s[1].length;
}
return 0;
}

测试结果:

trace(numberCalculate(256.08,123.1,"+"));      //379.18
trace(numberCalculate(256.08,123.11,"-")); //132.97
trace(numberCalculate(8.4,0.112,"*")); //0.9408

[AS3.0] 解决Number类型计算不精确问题的更多相关文章

  1. 转载:as3.0下对象类型返回值与变量默认值的详细说明

    转自:http://www.cuplayer.com/player/PlayerCodeAs/2012/0905367.html Null.NaN.undefined 及各自应用对象:变量的默认值: ...

  2. Oracle Number类型超长小数位为0问题

    碰到了一个非常奇怪的问题,从Excel拷贝出来的数据,位数很长,通过Pl Sql 导出到Oracle后为0了,而且设置查询条件为0时,无法查询出来,条件大于0居然能查询出来,通过to_number也是 ...

  3. ORACLE NUMBER类型Scale为0引发的问题

    今天遇到了一个很有意思的NUMBER类型Scale引发的问题,我用一个简单的测试用例来展示一下这个案例.假如有个TEST的表,有个字段类型为NUMBER,我插入下面两条数据 CREATE TABLE ...

  4. 给Number类型增加加法、减、乘、除函数,解决float相加结果精度错乱的问题

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  5. 解决input为number类型时maxlength无效的问题

    使用input数字number类型的时候maxlength无效,假设需要控制输入数量为18,可以用以下方式: 无效: <input type="text"  maxlengt ...

  6. 解决input,number类型的maxlength无效

    使用input数字number类型的时候maxlength无效,假设需要控制输入数量为5,可以用以下方式: 无效: <input type="text"  maxlength ...

  7. 使用 JavaScript 中的变量、数据类型和运算符,计算出两个 number 类型的变量与一个 string 类型的变量的和,根据 string 类型处于运算符的不同位置得到不同的结果

    查看本章节 查看作业目录 需求说明: 使用 JavaScript 中的变量.数据类型和运算符,计算出两个 number 类型的变量与一个 string 类型的变量的和,根据 string 类型处于运算 ...

  8. [转]AS3 int uint Number

    转自:http://luhantu.iteye.com/blog/1910301 AS3 int uint Number 博客分类: AS3 flex number 类型  1) int 类可使用表示 ...

  9. Java中的Double类型计算

    一.问题的提出: 如果我们编译运行下面这个程序会看到什么?public class Test{    public static void main(String args[]){        Sy ...

随机推荐

  1. ansible Developing Plugins

    Action plugins是模块的前端,可以在调用模块本身之前对控制器执行操作. Cache plugins用于保存“facts”的缓存,以避免代价高昂的fact-gathering操作. Call ...

  2. python在windows环境安装MySQLdb

    一.环境 系统:win7,64位 python版本:2.7.15 pip版本:10.0.1 二.安装 1. 用pip安装 pip install MySQLdb 报错: Could not find ...

  3. Linux下patch的制作和应用

    转自:http://blog.chinaunix.net/u3/100239/showart_1984963.html 首先介绍一下diff和patch.在这里不会把man在线文档上所有的选项都介绍一 ...

  4. SqlMapConfig.xml配置文件中的mapper映射器标签

    Mapper配置的几种方式: 1. <mapper resource=" "/> 使用相对于类路径的资源 如:<mapper resource="com ...

  5. 不同包之间的继承extends

    情景如下: 两个类:ExtendsSuper(父类).ExtendsSub(子类) 两个包:父类ExtendsSuper位于包packSuper路径下,子类ExtendsSub位于包packSub路径 ...

  6. Luogu 4512 【模板】多项式除法

    高级操作,感觉非常神仙. 题目中的字母太难懂了,重新定义一下. $$A(x) = B(x) * C(x) + D(x)$$ 其中,$A(x)$的次数是$n$,$B(x)$的次数是$m$,$A, B$都 ...

  7. ADO.NET DataTable的复制(clone)

    using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=test;Integrated Se ...

  8. 【转】java.sql.SQLException: statement is closed语句被关闭 druid连接池报错

    我之前在用druid 1.0.28版本也出现过这个问题, 现象就是: 报这个错的时候, 往往会出现在一条毫无错误的sql执行上报错,  sql放到数据库上执行或者单独拎出来执行完全没问题, 但是为什么 ...

  9. 使用js/jquery查找iframe中的

    原生js  一.在iframe的父窗口中获取iframe中的元素: js代码 格式: window.frames["iframe的name值"].document.getEleme ...

  10. PHP(六)PHP和HTML混合的一种形式