首页 > 试题广场 >

写一个求和的函数sum,达到下面的效果

[问答题]
写一个求和的函数sum,达到下面的效果
// Should equal 15
sum(1, 2, 3, 4, 5);
// Should equal 0
sum(5, null, -5);
// Should equal 10
sum('1.0', false, 1, true, 1, 'A', 1, 'B', 1, 'C', 1, 'D', 1,
  'E', 1, 'F', 1, 'G', 1);
// Should equal 0.3, not 0.30000000000000004
sum(0.1, 0.2);
推荐
function sum() {
    var nResult = 0;
    for (var i = 0, l = arguments.length; i < l; i++) {
    nResult +=  (!isNaN(arguments[i]) && window.parseFloat(arguments[i]))||0;
    }
    return nResult.toFixed(3) * 1000 / 1000;
}

编辑于 2016-11-02 08:55:18 回复(13)
window.parseFloat(arguments[i]) || 0   
parseFloat的结果要么为一个小数,要么为NaN,||运算如果前一个为真则不计算后一个,直接返回前一个表达式的值,如果是NaN则返回后一个表达式的值;
nResult.toFixed(3) * 1000 / 1000
这个是在做:保留三位小数,并且去掉末尾的0,最后一位会进行四舍五入。
发表于 2016-03-17 22:22:32 回复(2)
function sum(){
var sum=0;
	if(arguments.length>0){//判定是否传入参数
	var arglength = arguments.length;//获得传入参数个数
	var n=0;//定义一个变量,用于存放各个参数
		for(var i=0;i<arglength;i++){
			n =arguments[i];//将参数赋值个变量
			if(!isNaN(n)){//判定是否是数字,不能过滤boolean
				if(typeof n!='boolean'){//判定不是boolean
					if(sum.toString().indexOf(".")>=0||n.toString().indexOf(".")>=0){//判定数字是否含有小数点
					var r1,r2,m; //定义变量
					try{r1=sum.toString().split(".")[1].length}catch(e){r1=0} //获取小数点后的位数
					try{r2=n.toString().split(".")[1].length}catch(e){r2=0} //获取小数点后的位数
					m=Math.pow(10,Math.max(r1,r2)); //获取最多的小数点后位数
						sum=(sum*m+parseFloat(n)*m)/m;//进行数学计算
					}else{
						sum+=parseInt(n);//进行数学计算
					}
				}
			}
		}
	}
	return sum;
}

发表于 2015-08-26 07:48:21 回复(4)
varsum = function(...args){
    vars = args.reduce(function(sum,e){
        if(typeof e == 'string'){
            return sum;
        }
        return sum + Number(e);
    },0);
    if(Number.isInteger(s)){
        return s;
    }
    return s.toFixed(1);
}

编辑于 2017-08-09 21:25:53 回复(0)
function sum (...args){
    let total = args.reduce(
      (sum, cur)=>{
		  if(!isNaN(parseFloat(cur))) {
			sum += parseFloat(cur)
		  }	
          return sum;
     }, 0)
    return +(total.toFixed(3));
}

发表于 2019-11-10 22:02:04 回复(0)
function sum(){
    var sum_n=0;

   for(var i=0;i<arguments.length;i++){

      if(!isNaN(parseFloat(arguments[i]))){
         sum_n+=parseFloat(arguments[i]);
           };


    }
alert(sum_n.toFixed(3) * 1000 / 1000);
}
sum('1.0',false, 1, true, 1, 'A', 1, 'B', 1, 'C', 1, 'D', 1,'E', 1, 'F', 1, 'G', 1);
sum(0.1,0.2);
sum(5, null, -5);
sum(1, 2, 3, 4, 5);


发表于 2018-09-06 17:11:01 回复(0)
    function sum() {
       return [].slice.call(arguments).map(function (v) {
           return isNaN(parseFloat(v)) ? 0 : Number(v)
       }).reduce(function (a , b) {
           return (a + b).toFixed(3) * 1000 / 1000;
       });
    }

发表于 2017-03-20 17:32:53 回复(1)
function sum(){ var sum = 0; for ( var i.= 0; i < arguments.length; i++ ){ if(! isNaN(parseFloat(arguments[i])) && typeof arguments[i]! ='boolean'){ sum += window.parseFloat(arguments[i]); } } return sum.toFixed(2)*100/100; }
发表于 2016-09-23 14:11:54 回复(0)
function sum(){
    var result = Array.prototype.reduce.call(arguments, (prev, curr) => {
        return prev + (!isNaN(curr) && parseFloat(curr) || 0)
    }, 0)

    console.log( result.toFixed(3) * 1 )
}

发表于 2017-08-20 15:58:53 回复(0)
function sum() {
        let res = 0;
        for (let i = 0; i < arguments.length; i++) {
          res += window.parseFloat(arguments[i]) || 0;
        }
        return (res.toFixed(1) * 10) / 10;
      }
编辑于 2024-03-28 12:23:54 回复(0)
function sum(...list) {
    // console.log(list);
    let lists = list.filter((item) => {
        return isNaN(parseInt(item)) == false
    })
    let res = lists.reduce(function (prev, cur) {
        return addNum(prev, cur)
    })
    return res
}
function addNum(num1, num2) {
    let sq1, sq2, multiple;
    try {
        sq1 = num1.toString().split('.')[1].length
    } catch (e) {
        sq1 = 0;
    }
    try {
        sq2 = num2.toString().split(".")[1].length;
    }
    catch (e) {
        sq2 = 0;
    }
    multiple = Math.pow(10, Math.max(sq1, sq2) + 1);
    return (num1 * multiple + num2 * multiple) / multiple;
}
发表于 2022-01-22 13:53:30 回复(0)
function sum(){
    let arr = [...arguments];
    let res = arr.reduce((a,b)=>{
        let after_b = Number(b);
        //屏蔽布尔值和非数字
        return a+(typeof b == 'boolean' ||Number.isNaN(after_b)?0:after_b);
    },0)
    //整数直接输出 非整数保留一个小数点
    return Number.isInteger(res)?res:res.toFixed(1);
}

发表于 2020-04-03 23:28:18 回复(0)
function sum(arr){
    var newarr = arr.map(item=>{
        if(isNaN(item) || typeof(item) === 'boolean'){
            item = 0;
        }
        return item
    });
    var result = 0;
    for(var i=0;i<newarr.length;i++){
        result += parseFloat(newarr[i]);
    }
    return result;
}
sum(['1.0',false, 1, true, 1, 'A', 1, 'B', 1, 'C', 1, 'D', 1,
  'E', 1, 'F', 1, 'G', 1]);

发表于 2019-12-24 15:21:10 回复(0)
function sum(...args){
let sum = 0;
args.forEach(ele => {
if(Number.isInteger(ele)){
sum += parseInt(ele);
}else if(parseFloat(ele)){
sum += parseFloat(ele);
}
})
if(!Number.isInteger(sum)){
sum = Math.round(sum*100000)/100000
}
return sum;
}

发表于 2019-03-13 21:54:28 回复(0)
var c = 0;
function sum(...rest){
    for(var i = 0;i < rest.length;i++){
        if( isNaN(parseInt(rest[i])) ){
            c += rest[i]
        }
    }
    return c;
}
发表于 2019-02-25 22:14:50 回复(0)
// 主要计算函数
function sum(){
   let args = Array.prototype.slice.call(arguments,0);
   if(!args.length) return 0;
   let result =0;
   args.forEach(function(value){
          result += formatter(value);
    })
   return result;
}
// 格式化数据方法
function formatter(value){
   var type = Object.prototype.toString.call(value);
   let validArray = ['[object Number]','[object String]'];
    if(validArray.indexof(type)===-1) return 0; // 处理所有非字符和数字数据,都设置为0
      // 处理大写字母
     if(type==='[object String]' && charCodeAt(value)<65 && charCodeAt(value)>97 ){
       return 0;
      }
     return Number(value);
}
发表于 2019-02-09 13:07:54 回复(0)
function sum() {
var array = Array.prototype.slice.call(arguments).reduce((accumlator, val) => {
if (typeof val == 'number' || typeof val == 'string') {
// 转换成字符串,同时过滤非数字符串
if (+val === +val) {
val += ''
accumlator.push(val)
}
}
return accumlator
}, [])
var maxDot = Math.max(...array.map(x => x.length - 1 - x.indexOf('.')))
var base = Math.pow(10, maxDot)
var sum = array.reduce((accumlator, val) => {
val *= base
accumlator += val
return accumlator
}, 0)
return sum /= base
}

发表于 2018-06-22 14:28:02 回复(0)
参考答案给出的方法很精简也十分考察js基础功底——“nResult +=  (!isNaN(arguments[i]) && window.parseFloat(arguments[i]))||0;”:
1.通过isNaN判断参数是否是能够转换成数值,如果能则返回false,即!isNaN(arguments[i])返回true,这时“||”的左边返回window.parseFloat(arguments[i]),否则,左边返回false;
2.根据第一步“||”左边获取的值,如果为false,则返回0,否则,不执行“||”右边;
3.最后得出数值。
function sum() {
    varnResult = 0;
    for(vari = 0, l = arguments.length; i < l; i++) {
    nResult +=  (!isNaN(arguments[i]) && window.parseFloat(arguments[i]))||0;
    }
    returnnResult.toFixed(3) * 1000 / 1000;
}

发表于 2018-05-29 16:55:05 回复(0)
function sum() {
var result = 0;
var data = Array.prototype.slice.call(arguments);
data.forEach(function(item) {
if ((typeof item !== 'string' && typeof item !== 'number') || isNaN(item)) {
return;
}
result += Number(item) * 10;
})

return Number(result / 10);
}
发表于 2018-05-24 22:26:34 回复(0)
function sum(){
        return Array.prototype.reduce.call(arguments,function (pre,cur) {
             pre = !isNaN(pre)&&parseFloat(pre)||0;
             cur = !isNaN(cur)&&parseFloat(cur)||0;
             return (pre+cur).toFixed(3)*1000/1000;
         })
     }

编辑于 2018-05-06 16:16:50 回复(0)
function sum(){
    var sum_n=0;
    var arg;
   for(var i=0;i<arguments.length;i++){
      if(isNaN(arguments[i])){
           arg=parseInt(arguments[i]);
           if(isNaN(arg)){}
           else{
               sum_n+=arg;
           } 
       }else{
        sum_n+=arguments[i];
        } 
    }
    return sum_n;
}

发表于 2018-04-02 20:04:48 回复(0)