try只是捕获错误,被try包围的语句如果出错了也会继续执行下面的。
这里try里面的语句是获取小数位的长度,假如s1是整数的话s1.split(".")[1].length这句会出错。所以忽略这句,继续执行下面的。
如果不用try的话可以改成下面的
function accMul(arg1, arg2) {var m = 0,
s1 = arg1.toString(),
s2 = arg2.toString(),
t
t = s1.split(".")
// 判断有没有小数位,避免出错
if (t[1]) {
m += t[1].length
}
t = s2.split(".")
if (t[1]) {
m += t[1].length
}
return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
}
js含有小数的计算都会有丢失精度的问题
实际上解决的办法就是
把小数转化为整数计算 并同时记住扩大的倍数
最后把结果缩小这个倍数 得到不丢失精度的结果
try catch 就是捕获异常 如果没有捕获肯定会报错
也就是你现在按流程所设想的
但是catch(e){} 是捕获了异常 但是里面并没有任何操作
也就是 越过去了 忽略掉
// 这句就是像将小数点去掉 变成整数 如果没有小数点那就没有变化// 然后计算之后 缩小 10的m次方倍 也就是之前扩大了的倍数
Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)
// js小数加减乘除时精度修正
export const floatObj = function () {
//加法
function add(a,b){
return math.number(math.add(math.bignumber(a), math.bignumber(b)))
}
//减法
function subtract(a,b){
return math.number(math.subtract(math.bignumber(a), math.bignumber(b)))
}
// 乘法
function multiply(a,b){
return math.number(math.multiply(math.bignumber(a), math.bignumber(b)))
}
// 除法
function divide(a,b){
let num
a==0||b==0? num = 0 : num = math.number(math.divide(math.bignumber(a), math.bignumber(b)))
return num
}
//四舍五入并保留n位小数(isRound是否四舍五入)
function fomatFloat(num,n,isRound){
var f = parseFloat(num)
if(isNaN(f)){
return false
}
f = Math.round(num*Math.pow(10, isRound?n:n+1))/Math.pow(10, isRound?n:n+1) // n 幂
var s = f.toString()
var rs = s.indexOf('.')
//判定如果是整数,增加小数点再补0
if(rs < 0){
rs = s.length
s += '.'
}
while(s.length <= rs + n){
s += '0'
}
let _s = s.split(".")[0] + '.' + (s.split(".")[1].substr(0,n))
return Number(isRound?s:_s)
}
return {
add: add,
subtract: subtract,
multiply: multiply,
divide: divide,
fomatFloat
}
}()