两个大数相乘(包括小数,负数)

tech2024-05-21  65

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 }
最新回复(0)