首页 > 试题广场 >

乘法

[编程题]乘法
  • 热度指数:44646 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
求 a 和 b 相乘的值,a 和 b 可能是小数,需要注意结果的精度问题
示例1

输入

3, 0.0001

输出

0.0003
function multiply(a, b) {
	var a = a;
    var b = b;
    if(isInteger(a)&&isInteger(b)){
        return a * b;
    }else{
        var ad = a.toString().split(".").length > 1 ? a.toString().split(".")[1].length:0;
        var bd = b.toString().split(".").length > 1 ? b.toString().split(".")[1].length:0;
        return (a * b).toFixed(ad+bd);
    }
    function isInteger(num){
        if(parseInt(num)===num){
            return true;
        }else{
            return false;
        }
    }
}

发表于 2017-05-31 10:47:26 回复(0)
function multiply(a, b) {
   
    return (a*10 * b*10)/100;

}

发表于 2020-01-08 20:26:55 回复(0)
在网上找到的
function multiply(a, b) {
    //var reg = /(\d+\.)|(\d+)/;
    var reg = /\d*[\.\d]/;
    var la = a.toString().replace(reg,"").length,
        lb = b.toString().replace(reg,"").length;
    return (a*b).toFixed(la+lb);
}
发表于 2019-10-08 18:23:56 回复(2)
function multiply(a, b) {
return ((a*10000)*(b*10000)/10000/10000);
}
这个代码只是能过测试 主要考察JS的浮点数精度问题 示例里的两数直接相乘会在后面几位出现误差

发表于 2018-09-22 02:02:48 回复(2)
function multiply(a, b) {
    function getDecimalLength(x) {
        var str = x.toString();
        var index = str.indexOf('.');
        return index == -1 ? 0 : str.length - index - 1;
    }
    var decimalLength = getDecimalLength(a) + getDecimalLength(b);
    var ans = a * b;
    ans = ans.toFixed(decimalLength);
    ans = parseFloat(ans.toString());
    return ans;
}
发表于 2018-03-25 11:21:34 回复(0)
有没有人试过  multiply(30000, 0.0001);
发表于 2016-03-22 16:08:35 回复(0)
先将小数用10的n次方转化成整数,乘完的结果在除以之前乘了多少个10
function multiply(a, b) {
    a = a.toString();
    b = b.toString();
    var aLen = a.substring(a.indexOf(".")+1).length;
    var bLen = a.substring(a.indexOf(".")+1).length;
    return (a * Math.pow(10,aLen)) * (b * Math.pow(10,bLen)) / Math.pow(10,aLen+bLen);
}

发表于 2015-11-24 17:59:49 回复(8)
通过将a、b小数位数的相加,能够得到a*b结果的小数位数最大可能值。然后使用toFixed方法可以将结果的小数位数指定为可能的最大值,即保证了结果的精度。但本题实际上,仅返回a*b也能通过。在浏览器上做实验,最大17位的小数位数满足了该题全部的测试用例。
function multiply(a, b) {
  return a*b;
 }

编辑于 2015-08-19 10:41:31 回复(12)
//根据两个书中精度较高的一个来确定,先将其转换成字符串,然后根据小数点的位置确定小数位数,
//字符串长度减去‘.'的位置后还要再减去1得到正确的小数位数,两个取其大,然后用toFixed()函数确定 //结果的小数位数
function multiply(a, b) {
   //求两个数中精度大的一个
    var stra=a.toString();
    var strb=b.toString();
    var len=Math.max(stra.length-stra.indexOf('.')-1,strb.length-strb.indexOf('.')-1);
    //
    return parseFloat(a*b).toFixed(len);
}
发表于 2016-07-15 09:22:35 回复(12)
计算两小数的小数点位数,然后相加得到保留的小数点位数,用tofixed函数即可
function multiply(a, b) {
    var re = /\./;
    var aDec = a.toString().split('.')[1] || '';
    var bDec = b.toString().split('.')[1] || '';
    var fix = aDec.length  + bDec.length;
    return (a * b).toFixed(fix);
}
发表于 2017-03-16 21:10:49 回复(8)
function multiply(a, b) {
    return parseFloat((a*b).toFixed(10));
}
发表于 2015-08-06 23:04:16 回复(3)
乘法的精度,应为两个数的小数部分长度相加,不懂为什么前面的很多都是取两者中较大的为精度?
function multiply(a, b) {
    var strA = ''+a;
    var strB = ''+b;
    var lenA = (strA.indexOf('.')==-1)?0:(strA.length-strA.indexOf('.')-1);
    var lenB = (strB.indexOf('.')==-1)?0:(strB.length-strB.indexOf('.')-1);
    var len = lenA+lenB
    var result = (a*b).toFixed(len);
    return result;
}

发表于 2017-04-19 00:03:30 回复(3)
function multiply(a, b) {
    // 先将数字转换为字符串
    var strA=""+a; console.log(strA);
    var strB=""+b; console.log(strB);
    // 先获取两个数的小数位数
    var lenA=(strA.indexOf(".")==-1)?0:(strA.length-strA.indexOf(".")-1);
    var lenB=(strB.indexOf(".")==-1)?0:(strB.length-strB.indexOf(".")-1);
    // 比较两数的精度,精度大的作为结果数精度
    len=Math.max(lenA,lenB); 
    console.log("lenA "+lenA+"\t"+"lenB "+lenB+"\n");
    // 计算运算结果
    var result=null;
    result=parseFloat(a*b).toFixed(len); console.log("float "+result+"\n");
    return result;
}

如何将数字原原本本的转换为字符串(例如 3.01->> "3.01")

发表于 2016-07-18 21:32:42 回复(4)
    function len(num) {
        var str = num.toString();
        var index = str.indexOf('.');
        return index == -1 ? 0 : str.length - index - 1;
    }

    function solution(a, b) {
        var length = Math.pow(10, len(a) +len(b));
        return a * length * b / length;
    }

    console.log(solution(0, 0.001));
    console.log(solution(0.001, 0.001));
    console.log(solution(3, 0.001));
    console.log(solution(1000, 0.001));

发表于 2016-07-24 15:19:13 回复(0)
function multiply(a, b) {
var a1=a*10000;
    var b1=b*10000;
    var temp = a1*b1;
    var result = temp/100000000;
    return result
}
比较野蛮的方法 大家应该一看就懂
发表于 2022-01-27 15:08:31 回复(0)
function multiply(a, b) {
    let [len1,len2] = [1,1];
    if(String(a).indexOf('.') != -1) {
        len1 = String(a).length - String(a).indexOf('.') -1;
        len1 = Math.pow(10,len2);
        a = a*len1;
    }
    if(String(b).indexOf('.') != -1) {
        len2 = String(b).length - String(a).indexOf('.') -1;
        len2 = Math.pow(10,len2);
        b = b*len2;
    }
    return (a*b)/(len1*len2);
}
js中,小数相乘由于精度问题,会出现误差,避免的方式是先将小数都变成整数,相乘后再除以放大的倍数,就不会出现精度问题带来的误差了
编辑于 2020-11-16 15:05:24 回复(1)
function multiply(a, b) {
	var x,y; 
	try{
		x = a.toString().split(".")[1].length;
	}catch(e){
		x = 0;
	};
	try{
		y = b.toString().split(".")[1].length;
	}catch(e){
		y = 0;
	};
	return ((a*Math.pow(10,x))*(b*Math.pow(10,y))) / Math.pow(10,x+y);
}

编辑于 2017-07-27 09:57:59 回复(0)
function multiply(a, b) {
    //var reg = /(\d+\.)|(\d+)/;
    var reg = /\d*[\.\d]/;
    var la = a.toString().replace(reg,"").length,
        lb = b.toString().replace(reg,"").length; 
    return (a*b).toFixed(la+lb);
}

编辑于 2016-05-30 03:38:15 回复(1)
function multiply(a,b){
    var len= b.toString().substring(b.toString().indexOf(".")+1,b.toString().length);
    return parseFloat(a*b).toFixed(len);
}
编辑于 2015-09-05 11:01:36 回复(1)
function multiply(a, b) {
    var na = parseInt(a.toString().replace('.',''));
    var nb = parseInt(b.toString().replace('.',''));
    return na*nb/(na/a)/(nb/b);
}
发表于 2023-09-07 17:57:31 回复(0)