zoukankan      html  css  js  c++  java
  • [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
  • 相关阅读:
    MFC中注释含义
    数字时钟
    布线问题分支限界法
    精度计算大数阶乘ACM常用算法
    C++库大全
    简单文本编辑器制作windows程序设计雏形
    使用计时器方法2
    MFC常用基本数据类型
    Xcode 代码格式化/自动排版
    android的color值
  • 原文地址:https://www.cnblogs.com/frost-yen/p/6813323.html
Copyright © 2011-2022 走看看