日期:2014-05-16  浏览次数:20318 次

js 1.1加0.6 等于1.7000000000000001 ???
function toxiaoshu(x) { //保留一位小数
 var f = Math.round(x*10)/10;
 if (isNaN(f)) {  
  return 0;  
 }
 return f;
}  
function zbhjgs(){ //检查用户输入,并进行转换
 var t=document.getElementsByName("tmp03");
 var j=0;
 var k="";
 for(var i = 0; i < t.length; i++){
  if (t[i].value!=''){
  t[i].value=toxiaoshu(t[i].value);
j+=toxiaoshu(t[i].value);
  }
 }
 document.getElementById("zonggongshi").innerHTML = j; //总工时
}

用户需要累积计算输入的工时
多个工时输入框
为什么用户输入1.1 和 0.6 会得出1.7000000000000001 ?
如何才能保证合计工时为一位小数的呢?


------解决方案--------------------
浮点型运算的时候就是有这样的BUG
JScript code

Object.extend(Number.prototype, {
    add: function (num) {

        var reg = /\./i;
        var me = this;
        if (!reg.test(me) && !reg.test(num)) {
            return me += num;
        }
        var i1, i2;
        try {
            i1 = me.toString().split('.')[1].length;
        }
        catch (e) {
            i1 = 0;
        }
        try {
            i2 = num.toString().split('.')[1].length;
        }
        catch (e) {
            i2 = 0;
        }
        var m = Math.pow(10, Math.max(i1, i2));
        return (me * m + num * m) / m;

    },
    sub: function (num) {
        var reg = /\./i;
        var me = this;
        if (!reg.test(me) && !reg.test(num)) {
            return me -= num;
        }
        var i1, i2;
        try {
            i1 = me.toString().split('.')[1].length;
        }
        catch (e) {
            i1 = 0;
        }
        try {
            i2 = num.toString().split('.')[1].length;
        }
        catch (e) {
            i2 = 0;
        }
        var m = Math.pow(10, Math.max(i1, i2));
        var n = (i1 >= i2) ? i1 : i2;
        return ((me * m - num * m) / m).toFixed(n);
    }
});