表达式编程(答案)

课后整理 2020-12-14

 编写一个求和函数sum(),要求达到如下情况和返回值效果。

sum(1, 2, 3, 4, 5);    //返回值为15
sum(5, null, -5);       //返回值为0
sum('1.0', false, 1,  true, 1, 'A', 1, 'B', 1, 'C', 1, 'D', 1, 'E', 1, 'F', 1, 'G', 1);      //返回值为10
sum(0.1, 0.2);      //返回值为0.3,而不是0.30000000000000004

解析:

本题包含有2个知识训练点:一是如何剔除非数字参数,二是如何处理浮点数溢出问题。

排除非数字参数,可以有多种方法,最简洁的方法是使用parseFloat()函数与||运算符结合使用。先使用parseFloat()函数把参数转换为浮点数,如果成功则加上转换后的数值,否则加0,排除转换中的NaN值。

浮点数溢出可以通过升位浮点数为整数相加,然后再降位实现,最后使用toFixed()方法去掉溢出小数即可。

参考:

function sum() {
    var nResult = 0;
    for (var i = 0, l = arguments.length; i  < l; i++) {
        nResult += 1000 *  parseFloat(arguments[i]) || 0;
    }
    return nResult.toFixed(3) / 1000;
}
alert(sum(0.1, 0.2))