You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
144 lines
3.7 KiB
144 lines
3.7 KiB
function accAdd(num1, num2) { // 加法
|
|
num1 = Number(num1)
|
|
num2 = Number(num2)
|
|
let dec1, dec2
|
|
try { dec1 = countDecimals(num1) + 1 } catch (e) { dec1 = 0 }
|
|
try { dec2 = countDecimals(num2) + 1 } catch (e) { dec2 = 0 }
|
|
const times = Math.pow(10, Math.max(dec1, dec2))
|
|
// let result = (num1 * times + num2 * times) / times
|
|
const result = (accMul(num1, times) + accMul(num2, times)) / times
|
|
return getCorrectResult('add', num1, num2, result)
|
|
// return result
|
|
}
|
|
|
|
function accSub(num1, num2) { // 减法
|
|
num1 = Number(num1)
|
|
num2 = Number(num2)
|
|
let dec1, dec2
|
|
try { dec1 = countDecimals(num1) + 1 } catch (e) { dec1 = 0 }
|
|
try { dec2 = countDecimals(num2) + 1 } catch (e) { dec2 = 0 }
|
|
const times = Math.pow(10, Math.max(dec1, dec2))
|
|
// let result = Number(((num1 * times - num2 * times) / times)
|
|
const result = Number((accMul(num1, times) - accMul(num2, times)) / times)
|
|
return getCorrectResult('sub', num1, num2, result)
|
|
// return result
|
|
}
|
|
|
|
function accDiv(num1, num2) { // 除法
|
|
num1 = Number(num1)
|
|
num2 = Number(num2)
|
|
let t1 = 0
|
|
let t2 = 0
|
|
try { t1 = countDecimals(num1) } catch (e) { console.log(e) }
|
|
try { t2 = countDecimals(num2) } catch (e) { console.log(e) }
|
|
const dec1 = convertToInt(num1)
|
|
const dec2 = convertToInt(num2)
|
|
const result = accMul((dec1 / dec2), Math.pow(10, t2 - t1))
|
|
return getCorrectResult('div', num1, num2, result)
|
|
// return result
|
|
}
|
|
|
|
function accMul(num1, num2) { // 乘法
|
|
num1 = Number(num1)
|
|
num2 = Number(num2)
|
|
let times = 0
|
|
const s1 = num1.toString()
|
|
const s2 = num2.toString()
|
|
try { times += countDecimals(s1) } catch (e) { console.log(e) }
|
|
try { times += countDecimals(s2) } catch (e) { console.log(e) }
|
|
const result = convertToInt(s1) * convertToInt(s2) / Math.pow(10, times)
|
|
return getCorrectResult('mul', num1, num2, result)
|
|
// return result
|
|
}
|
|
|
|
function countDecimals(num) {
|
|
var len = 0
|
|
try {
|
|
num = Number(num)
|
|
let str = num.toString().toUpperCase()
|
|
if (str.split('E').length === 2) { // scientific notation
|
|
let isDecimal = false
|
|
if (str.split('.').length === 2) {
|
|
str = str.split('.')[1]
|
|
if (parseInt(str.split('E')[0]) !== 0) {
|
|
isDecimal = true
|
|
}
|
|
}
|
|
const x = str.split('E')
|
|
if (isDecimal) {
|
|
len = x[0].length
|
|
}
|
|
len -= parseInt(x[1])
|
|
} else if (str.split('.').length === 2) { // decimal
|
|
if (parseInt(str.split('.')[1]) !== 0) {
|
|
len = str.split('.')[1].length
|
|
}
|
|
}
|
|
} catch (e) {
|
|
throw e
|
|
} finally {
|
|
if (isNaN(len) || len < 0) {
|
|
len = 0
|
|
}
|
|
// return len
|
|
}
|
|
return len
|
|
}
|
|
|
|
function convertToInt(num) {
|
|
num = Number(num)
|
|
let newNum = num
|
|
const times = countDecimals(num)
|
|
const temp_num = num.toString().toUpperCase()
|
|
if (temp_num.split('E').length === 2) {
|
|
newNum = Math.round(num * Math.pow(10, times))
|
|
} else {
|
|
newNum = Number(temp_num.replace('.', ''))
|
|
}
|
|
return newNum
|
|
}
|
|
|
|
function getCorrectResult(type, num1, num2, result) {
|
|
let temp_result = 0
|
|
switch (type) {
|
|
case 'add':
|
|
temp_result = num1 + num2
|
|
break
|
|
case 'sub':
|
|
temp_result = num1 - num2
|
|
break
|
|
case 'div':
|
|
temp_result = num1 / num2
|
|
break
|
|
case 'mul':
|
|
temp_result = num1 * num2
|
|
break
|
|
}
|
|
if (Math.abs(result - temp_result) > 1) {
|
|
return temp_result
|
|
}
|
|
return result
|
|
}
|
|
|
|
function checkWeight(input) {
|
|
return input.replace(/[^\d]/gi, '')
|
|
}
|
|
|
|
function showWeight(input) {
|
|
return accDiv(input, 1000).toFixed(3)
|
|
}
|
|
|
|
function checkSumWeight(input) {
|
|
return input.replace(/[^\d.]/gi, '')
|
|
}
|
|
|
|
module.exports = {
|
|
accAdd: accAdd,
|
|
accSub: accSub,
|
|
accDiv: accDiv,
|
|
accMul: accMul,
|
|
checkWeight: checkWeight,
|
|
checkSumWeight: checkSumWeight,
|
|
convertToInt: convertToInt,
|
|
showWeight: showWeight
|
|
}
|