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.
154 lines
3.5 KiB
154 lines
3.5 KiB
2 years ago
|
/// 计算方法
|
||
|
var countDecimals = function (num) {
|
||
|
var len = 0
|
||
|
try {
|
||
|
num = Number(num)
|
||
|
var str = num.toString().toUpperCase()
|
||
|
if (str.split('E').length === 2) { // scientific notation
|
||
|
var 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
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var convertToInt = function (num) {
|
||
|
num = Number(num)
|
||
|
var newNum = num
|
||
|
var times = countDecimals(num)
|
||
|
var 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
|
||
|
}
|
||
|
|
||
|
var getCorrectResult = function (type, num1, num2, result) {
|
||
|
var 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
|
||
|
}
|
||
|
export default {
|
||
|
// 加法
|
||
|
accAdd(num1, num2) {
|
||
|
num1 = Number(num1)
|
||
|
num2 = Number(num2)
|
||
|
var dec1, dec2, times
|
||
|
try {
|
||
|
dec1 = countDecimals(num1) + 1
|
||
|
} catch (e) {
|
||
|
dec1 = 0
|
||
|
}
|
||
|
try {
|
||
|
dec2 = countDecimals(num2) + 1
|
||
|
} catch (e) {
|
||
|
dec2 = 0
|
||
|
}
|
||
|
times = Math.pow(10, Math.max(dec1, dec2))
|
||
|
// var result = (num1 * times + num2 * times) / times;
|
||
|
var result = (this.accMul(num1, times) + this.accMul(num2, times)) / times
|
||
|
return getCorrectResult('add', num1, num2, result)
|
||
|
// return result;
|
||
|
},
|
||
|
// 减法
|
||
|
accSub(num1, num2) {
|
||
|
num1 = Number(num1)
|
||
|
num2 = Number(num2)
|
||
|
var dec1, dec2, times
|
||
|
try {
|
||
|
dec1 = countDecimals(num1) + 1
|
||
|
} catch (e) {
|
||
|
dec1 = 0
|
||
|
}
|
||
|
try {
|
||
|
dec2 = countDecimals(num2) + 1
|
||
|
} catch (e) {
|
||
|
dec2 = 0
|
||
|
}
|
||
|
times = Math.pow(10, Math.max(dec1, dec2))
|
||
|
// var result = Number(((num1 * times - num2 * times) / times);
|
||
|
var result = Number((this.accMul(num1, times) - this.accMul(num2, times)) / times)
|
||
|
return getCorrectResult('sub', num1, num2, result)
|
||
|
// return result;
|
||
|
},
|
||
|
// 除法
|
||
|
accDiv(num1, num2) {
|
||
|
num1 = Number(num1)
|
||
|
num2 = Number(num2)
|
||
|
var t1 = 0
|
||
|
var t2 = 0
|
||
|
var dec1;
|
||
|
var dec2
|
||
|
try {
|
||
|
t1 = countDecimals(num1)
|
||
|
} catch (e) {
|
||
|
}
|
||
|
try {
|
||
|
t2 = countDecimals(num2)
|
||
|
} catch (e) {
|
||
|
}
|
||
|
dec1 = convertToInt(num1)
|
||
|
dec2 = convertToInt(num2)
|
||
|
var result = this.accMul((dec1 / dec2), Math.pow(10, t2 - t1))
|
||
|
return getCorrectResult('div', num1, num2, result)
|
||
|
// return result;
|
||
|
},
|
||
|
// 乘法
|
||
|
accMul(num1, num2) {
|
||
|
num1 = Number(num1)
|
||
|
num2 = Number(num2)
|
||
|
var times = 0
|
||
|
var s1 = num1.toString()
|
||
|
var s2 = num2.toString()
|
||
|
try {
|
||
|
times += countDecimals(s1)
|
||
|
} catch (e) {
|
||
|
}
|
||
|
try {
|
||
|
times += countDecimals(s2)
|
||
|
} catch (e) {
|
||
|
}
|
||
|
var result = convertToInt(s1) * convertToInt(s2) / Math.pow(10, times)
|
||
|
return getCorrectResult('mul', num1, num2, result)
|
||
|
// return result;
|
||
|
}
|
||
|
}
|