之前知道就知道 js 的小数计算就存在精度问题,好比说 0.1+0.2 != 0.3,出现的缘由就是底层的十进制和二进制的转换问题,而后也看到一些解决方法,而后在网上看到一些解决办法
例git
Math.formatFloat = function(f, digit) { var m = Math.pow(10, digit); return parseInt(f * m, 10) / m; } var A = 0.1; var B = 0.2; console.log(Math.formatFloat(A + B, 1) === 0.3);
上面的解决办法的确解决了 0.1 + 0.2 的问题,由于 0.1 + 0.2 = 0.300xxx4。
可是若是是 15.122222222 + 15.111111111 呢,那么就出现问题了,他俩相加等于 30.233333332999997 这里已经把最后一个 3 转换为 2999997 了。
那么再用上述的方法就出错了,因此在本身写了一个改进的方法其中包括加减乘除运算算法
Math.formatFloat = function (n, m, rule) { let digit if (n > m) { for (let i = 1; i < 20; i++) { if (m * Math.pow(10, i) == parseInt(m * Math.pow(10, i))) { digit = i break } } } else { for (let i = 1; i < 20; i++) { if (n * Math.pow(10, i) == parseInt(n * Math.pow(10, i))) { digit = i break } } } const multiple = Math.pow(10, digit) switch (rule) { case '+': return parseInt((n * multiple + m * multiple), 10) / multiple break case '-': return parseInt((n * multiple - m * multiple), 10) / multiple break case '*': return parseInt((n * multiple * m * multiple), 10) / multiple / multiple break case '/': return parseInt((n * multiple / m * multiple), 10) / multiple / multiple break default: return '未知算法' } }
而后通过测试发现是可行的,还实验了一些小数测试,发现是可行的,可是有的状况是没测试到的,若是有其余的错误请指出让我改正。。。测试