0

我有一个简单的表格,允许用户输入 2 个数字,然后一个脚本计算年度平均值并获取选择菜单中具有相同选项的所有行的总数。

我已经设置了一个示例 JSFiddle:

http://jsfiddle.net/fmdataweb/73Jzc/1/

这显示了它是如何工作的。我刚刚注意到,有时我会收到一个奇怪的舍入错误(我希望它舍入到小数点后一位)。例如,如果您选择“中等”,然后输入 5 和 4,平均为 0.4,然后单击按钮创建新行并再次选择“中等”,然后输入 3 和 40,平均为 2.3,您会注意到中等的总数是“2.6999999999999997”,而它应该是 2.7。

如果您输入其他数字,到目前为止在我的测试中都很好,但由于某种原因,这些组合不会对总数进行四舍五入,我不知道为什么。感谢是否有人能指出我脚本中的错误。这是执行平均值和总计的脚本:

$('#nextYear')
    .on('change', 'select', calc)
    .on('keyup', 'input', calc);

function calc(){

    $('#nextYear tr:has(.risk)').each(function(i,v){

        var $cel = $(v.cells);

        var $risk = $cel.eq(1).find('option:selected').val();
        var $numb = $cel.eq(2).find('input').val();
        var $weeks = $cel.eq(3).find('input').val();
        var $avg = ($numb * $weeks) / 52;
        var $avgRounded = Math.round( $avg * 10 ) / 10;

        $cel.eq(4).find('input').val($avgRounded);

    });   

    var tot = {};

    $('#nextYear tr:has(.risk) option:selected')
                .map(function(i){
                    var el = $(this).val();
                    var qty = parseFloat($('#nextYear tr:has(.risk)').eq(i).find('td:last').prev().find('input').val());

                    if (!tot.hasOwnProperty(el)) {
                        tot[el] = 0;            
                    }
                    tot[el] += qty
                    return tot;
                }).get();

     // console.log(tot);
      $('#textfield6').val(tot.moderate);
     $('#textfield7').val( tot.high );

  }

​</p>

4

2 回答 2

3

尝试$avg.toFixed(1);代替Math.round( $avg * 10 ) / 10;

于 2012-08-15T17:10:57.760 回答
3

你的问题在这里:

$('#textfield6').val(tot.moderate);
$('#textfield7').val( tot.high );

你必须像你一样把它们四舍五入

var $avgRounded = Math.round( $avg * 10 ) / 10;

或使用.toFixed(1)

编辑:

然后,代码是:

$('#textfield6').val(tot.moderate.toFixed(1));
$('#textfield7').val(tot.high.toFixed(1));

你可以在这里看到它:http: //jsfiddle.net/73Jzc/2/

于 2012-08-15T17:16:17.897 回答