工作中要处理两个数的乘法,网上搜索了没有找到满意的答案,然后根据网上提供的思路自己实现了一个,重点满足容错的要求,就是不会轻易报错。
主要算法是记录小数点后位数的总长度,然后将两个数转变成整数后相乘,再根据小数点后位数的总长度将乘积转变成小数。
代码如下:
/**
* 两个数的精确乘法
* @param v1
* @param v2
*
* 对于不能处理的问题,此方法一律返回 0
*
* @returns {number}
*/
function numberMultiplication (v1, v2) {
if (isNaN(v1) || isNaN(v2)) {
return 0
}
var isNegative = false;
if ((v1 < 0 && v2 >= 0) || (v1 >=0 && v2 < 0)) {
isNegative = true;
}
var f1 = '' + Math.abs(v1),
f2 = '' + Math.abs(v2);
var arr1 = f1.split('.'),
arr2 = f2.split('.');
var f11 = arr1[0],
f12 = 0,
f21 = arr2[0],
f22 = 0,
len1 = 0,
len2 = 0;
if (arr1.length >= 2) {
f12 = arr1[1];
len1 = f12.length;
}
if (arr2.length >= 2) {
f22 = arr2[1];
len2 = f22.length;
}
var x1 = 0,
x2 = 0;
if (f11 > 0) {
x1 = f1.replace('.', '');
} else {
x1 = f12;
}
if (f21 > 0) {
x2 = f2.replace('.', '');
} else {
x2 = f22;
}
var ret = x1 * x2 / Math.pow(10, len1 + len2);
if (isNegative) {
return -ret;
} else {
return ret;
}
}