function product (num1, num2) {
var sum = [] // 在数组中存倒叙的结果
var fuhao = '' // 判断正负
var point = 0 // 小数点后位数
if (num1 == 0 || num2 == 0) return '0' // 传入数字有0直接返回0
// 判断正负
if(num1[0] == '-') fuhao = '-'
if(num2[0] == '-' ){
fuhao = fuhao ? '' : '-'
}
// 计算小数点后位数
if(num1.indexOf('.') != -1){
point += num1.length - num1.indexOf('.') - 1
}
if(num2.indexOf('.') != -1){
point += num2.length - num2.indexOf('.') - 1
}
// 去除- 和 .
num1=num1.replace("-","")
num2=num2.replace("-","")
num1=num1.replace(".","")
num2=num2.replace(".","")
var success = true // 判断输入的数字是否是错误的
for(var i = 0; i< num1.length;i++){
for(var j=0;j<num2.length;j++){
let product = num1[num1.length - 1 - i] * num2[num2.length - 1 - j] // 两个一位数的乘积最大为9*9=81
if(!product && product != 0){ // 如果乘积是NAN 则证明输入数字有误
success = false
}
let un1 = product % 10 // 个为数
let un2 = Math.floor(product/10) // 十位数
// 因为product最大值为81,所以sum中的数字加起来,最多变成3位数,所以预创建数组的长度
if(!sum[i+j]) sum[i+j] = 0
if(!sum[i+j+1]) sum[i+j+1] = 0
if(!sum[i+j+2]) sum[i+j+2] = 0
let sum1 = sum[i+j] - 0 + un1 // 当前数字与个位数的合最多是十几
sum[i+j] = sum1 % 10 //
let sum2 = sum[i+j+1] - 0 + un2 + Math.floor(sum1/10)
sum[i+j+1] = sum2 % 10
sum[i+j + 2] = sum[i+j + 2] - 0 + Math.floor(sum2/10)
}
}
// 输入数字有误
if(!success){
return false
}
var str = sum.reverse().join('')
if (point != 0){
// str = newStr(str, point)
// 先在对应位置加上小数点
var str = str.slice(0, str.length - point) + '.' + str.slice(-point)
// 去除尾部的多余的0
while(true){
var i = str.length - 1
if(str[i] == 0){
str = str.slice(0, i)
}else if(str[i] == '.'){
str = str.slice(0, i)
break
}else {
break
}
}
// 去除开始多余的0
while(true){
if(str[0] == 0 && str[1] && str[1]!='.'){
str = str.slice(1, str.length)
}else {
break
}
}
} else{
// 去除开始多余的0
while(true){
if(str[0] == 0){
str = str.slice(1, str.length)
}else {
break
}
}
}
// 添加符号
if(fuhao){
str = '-' + str
}
return str
}
两个大数相乘(包括小数,负数)
最新推荐文章于 2021-05-17 13:53:26 发布