[AS3.0] 解决Number类型计算不精确问题

看下面代码运行结果:

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

 

转载于:https://www.cnblogs.com/frost-yen/p/6813323.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值