身边的人都不知道问题在哪,帮忙看下吧!

芦宇
  • 0
新手上路,请多包涵

div是封装的一个除法函数,已经用了很久,直到今天发现了一个bug,于是在网上搜了其他的函数替换之,解决!但之前的函数我怎么也没看出来问题在哪,望大佬指点一二

function div(a, b) {
    var a = a == '' || isNaN(Number(a)) ? 0 : Number(a)
    var b = b == '' || isNaN(Number(b)) ? 0 : Number(b)
    var c, d, e = 0,
        f = 0
    try {
        e = a.toString().split('.')[1].length
    } catch (g) {
    }
    try {
        f = b.toString().split('.')[1].length
    } catch (g) {
    }
    return c = Number(a.toString().replace('.', '')), d = Number(b.toString().replace('.', '')), mul(c / d, Math.pow(10, f - e))
};
function mul(a, b) {
    var c = 0,
        d = a.toString(),
        e = b.toString()
    try {
        c += d.split('.')[1].length
    } catch (f) {
    }
    try {
        c += e.split('.')[1].length
    } catch (f) {
    }
    return (
        (Number(d.replace('.', '')) * Number(e.replace('.', ''))) / Math.pow(10, c)
    )
}


console.log(10 / 2.0000001)   // 4.999999750000013
console.log( div(10, 2.0000001) )  // 0.004999999750000013

可以看出来第二次console结果明显不正确的,这种情况目前我只发现在第二个参数小数位过多的话会出现

回复
阅读 1.5k
5 个回答

Math.pow(10, -7).toString() ==> 1e-7

(10 / 20000001).toString() ==> 4.999999750000013e-7

没处理科学计数法

image.png

调用mul函数的时候传入值转成了科学计数法,toString的时候后边多了e-7

问题在于 c / d ,当 b 小数位过多,你这种转换法会导致 d 很大,最后导致 c / d 的结果会用科学计数法表示,即 4.999999750000013e-7 这种形式,然后你将小数点去掉再转 Number 会导致它小了几位(4999999750000013 -> 499999975.0000013),所以算出来的结果有差异。

Lyde_Su
  • 1k

d的科学计数问题,给你一个正确的函数:

function toD (val) {
  const e = String(val)
  let rex = /^([0-9])\.?([0-9]*)e-([0-9])/
  if (!rex.test(e)) return val
  const numArr = e.match(rex)
  const n = Number('' + numArr[1] + (numArr[2] || ''))
  const num = '0.' + String(Math.pow(10, Number(numArr[3]) - 1)).substr(1) + n
  return num.replace(/0*$/, '')
};
function div(a, b) {
    var a = a == '' || isNaN(Number(a)) ? 0 : Number(a)
    var b = b == '' || isNaN(Number(b)) ? 0 : Number(b)
    var c, d, e = 0,
        f = 0
    try {
        e = a.toString().split('.')[1].length
    } catch (g) {
    }
    try {
        f = b.toString().split('.')[1].length
    } catch (g) {
    }
    return c = Number(a.toString().replace('.', '')), d = Number(b.toString().replace('.', '')), mul(c / d, Math.pow(10, f - e))
};
function mul(a, b) {
    var c = 0,
        d = toD(a.toString()),
        e = b.toString()
    try {
        c += d.split('.')[1].length
    } catch (f) {
    }
    try {
        c += e.split('.')[1].length
    } catch (f) {
    }
    return (
        (Number(d.replace('.', '')) * Number(e.replace('.', ''))) / Math.pow(10, c)
    )
};

console.log(10 / 2.0000001)   // 4.999999750000013
console.log( div(10, 2.0000001) )
宣传栏