首先说一下背景,经理让给他做个计算用的小工具,一开始给他写的BS结构的,可做好后他说数据涉汲到公司机密,所以不能和后台服务器有交互!弄个单机版的出来。所以我就准备写个纯网页版的工具,用js做里面的逻辑部分。可是发现同样的代码,在chrome上运行正常,到了IE就运算不出来,或者运算错误,求大神们帮忙看一下,主要功能就是通过一个公式计算出一个已方的投标价格得分以及其它公司的得分,js代码如下:                var maxP=Math.max.apply(null,priceList)//最大投标值
var minP=Math.min.apply(null,priceList)//最小投标值
var pianlidu=(maxP*1-minP*1)/avgprice //报价偏离度

//最低得分与报价偏离度有关系
var minQ=0;//最低得分
if (pianlidu*1<=0.1) {
minQ=fulls*0.9;
}else if (0.1<pianlidu*1<=0.2) {
minQ=fulls*0.8;
}else if (0.2<pianlidu*1<=0.3) {
minQ=fulls*0.7;
}else if (0.3<pianlidu*1<=0.4) {
minQ=fulls*0.6;
}else if (0.4<pianlidu*1) {
minQ=fulls*1*0.5;
};;;;; //得出结果
var K=(fulls*1-minQ*1)/(maxP*1-minP*1);
var Si=fulls*1-K*1*(myprice*1-minP*1);
var result=document.getElementById("result");
var allSi=new Array();
for (var i = 0; i<listlength; i++) {
tempSi=(fulls*1-K*1*(priceList[i]*1-minP*1)).toFixed(2);
allSi.push(tempSi);
};

//把结果添加到页面
$("#result").append(
"</br><b>项目名称为:</b>"+projectname+
"</br><b>所有报价为:</b>"+priceList+
"</br><b>最高报价为:</b>"+maxP+
"</br><b>最低报价为:</b>"+minP+
"</br><b>平均报价为:</b>"+avgprice+
"</br><b>最低得分为:</b>"+minQ+
"</br><b>报价偏离度:</b>"+pianlidu.toFixed(2)+
"</br><b>K为:</b>"+K.toFixed(2)+
"</br><b>我的得分为:</b>"+Si.toFixed(2)+
"</br><b>所有得分为:</b>"+allSi+
"</br></br>"
);

就是从最低得分minQ这部分开始出错的,IE有时候求不出来,有时候又求错,比如fulls为30,pianlidu为0.5时,按照规则大于0.4,就是fulls*0.5=15才对,可是IE竟然得出来17,好怪!后来经理又提出需求,说要把结果导出到excel文件中,在网上看了一下,说是要用到ActiveXObject,而这个东西是微软的东西,只有IE才能用,额,这真是全面封杀我啊!求大神们解救!

解决方案 »

  1.   

    用JQuery之类的框架可以解决一般的兼容性问题~
      

  2.   

    Math.max.apply(null,priceList)
    改成Math.max.apply(Math,priceList)呢
      

  3.   

    最大值和最小值那里是没有问题的,我在一步步测,现在发现就是minQ=fulls*1*0.5;这一行代码后出错的,因为这之前打印minQ还是O,之后再打印就是NAN了。我不明白是乘法不能包含小数还是怎样。
      

  4.   

    $("document").ready(function(){ //字符串trim方法
    function LTrim(str){
        var i;
        for(i=0;i<str.length;i++)
        {
            if(str.charAt(i)!=" "&&str.charAt(i)!=" ")break;
        }
        str=str.substring(i,str.length);
        return str;
    } function RTrim(str){
        var i;
        for(i=str.length-1;i>=0;i--)
        {
            if(str.charAt(i)!=" "&&str.charAt(i)!=" ")break;
        }
        str=str.substring(0,i+1);
        return str;
    } function Trim(str){
        return LTrim(RTrim(str));
    }
    $("#qingchu").click(function() {
    // body...
    $("#result").empty();
    }) $("#jisuan").click(function() {
    // 根据固有公式计算分值,首先从页面内取值。
    var myprice=document.getElementById("myPrice").value;//我的价格
    var fulls=document.getElementById("fulls").value;//满分值 
    var otherprices=document.getElementById("otherPrices").value;//其它价格
    var projectname=document.getElementById("projectname").value;//我的价格 //创建投标价格数组
    var priceList =new Array();
    Trim(otherprices);
    priceList=otherprices.split(",");
    priceList.push(myprice);
    var listlength=priceList.length;//投标总人数

    //根据数据间的关系得出新的公式所需数据
    var total=0;//投标价格之和
    for (var i = 0; i <listlength; i++) {
    total=(total*1+priceList[i]*1);
    };
    var avgprice=total/listlength;//平均投标价格
    var maxP=Math.max.apply(null,priceList)//最大投标值
    var minP=Math.min.apply(null,priceList)//最小投标值
    var pianlidu=(maxP*1-minP*1)/avgprice //报价偏离度

    //最低得分与报价偏离度有关系
    var minQ=0;//最低得分

    if (pianlidu<=0.1) {
    minQ=fulls*1*0.9;

    }else if (0.1<pianlidu<=0.2) {
    minQ=fulls*1*0.8;
    }else if (0.2<pianlidu<=0.3) {
    minQ=fulls*1*0.7;
    }else if (0.3<pianlidu<=0.4) {
    minQ=fulls*1*0.6;
    }else if (0.4<pianlidu) {

    minQ=parseFloat(fulls)*1/2;
    alert(minQ); };
    //得出结果
    var K=(fulls*1-minQ*1)/(maxP*1-minP*1);
    var Si=fulls*1-K*1*(myprice*1-minP*1);
    var result=document.getElementById("result");
    var allSi=new Array();
    for (var i = 0; i<listlength; i++) {
    tempSi=(fulls*1-K*1*(priceList[i]*1-minP*1)).toFixed(2);
    allSi.push(tempSi);
    };

    //把结果添加到页面
    $("#result").append(
    "</br><b>项目名称为:</b>"+projectname+
    "</br><b>所有报价为:</b>"+priceList+
    "</br><b>最高报价为:</b>"+maxP+
    "</br><b>最低报价为:</b>"+minP+
    "</br><b>平均报价为:</b>"+avgprice+
    "</br><b>最低得分为:</b>"+minQ+
    "</br><b>报价偏离度:</b>"+pianlidu.toFixed(2)+
    "</br><b>K为:</b>"+K.toFixed(2)+
    "</br><b>我的得分为:</b>"+Si.toFixed(2)+
    "</br><b>所有得分为:</b>"+allSi+
    "</br></br>"
    );

    })
    })
    这是全部代码了。
      

  5.   

    最大值和最小值那里是没有问题的,我在一步步测,现在发现就是minQ=fulls*1*0.5;这一行代码后出错的,因为这之前打印minQ还是O,之后再打印就是NAN了。我不明白是乘法不能包含小数还是怎样。
    你调试过这个fulls的值吗? 出现NaN可能就是它的问题
      

  6.   

    最大值和最小值那里是没有问题的,我在一步步测,现在发现就是minQ=fulls*1*0.5;这一行代码后出错的,因为这之前打印minQ还是O,之后再打印就是NAN了。我不明白是乘法不能包含小数还是怎样。
    你调试过这个fulls的值吗? 出现NaN可能就是它的问题
    真是太感谢了,就是它的问题!仔细查看了一下,是在页面中出现的问题,因为同样是输入框,所以“满分值”的html代码是从“项目名称”复制的,然后下面只改了ID,name没改,然后它获取的时候就是个字符串了,所以会出错!以前出现17是因为我在项目名称上写的34,刚好乘以0.5就是17了。
    不过话说很怪,为什么其它浏览器用document.getElementById可以获取到正确的元素,而IE却不行,那个元素的id是正确的,是name错了!
      

  7.   

    最大值和最小值那里是没有问题的,我在一步步测,现在发现就是minQ=fulls*1*0.5;这一行代码后出错的,因为这之前打印minQ还是O,之后再打印就是NAN了。我不明白是乘法不能包含小数还是怎样。 那就是 fulls的问题
      

  8.   


    jquery也不是很兼容啊,有的地方也不兼容,