浮点数精度计算

耗尽温柔 提交于 2020-05-09 09:58:06

var util = {
    padding0: function (p) {
        var z = ''
        while (p--) {
            z += '0'
        }
        return z
    },
    /**
     * 解决小数精度问题
     * @param {*数字} a
     * @param {*数字} b
     * @param {*符号} sign
     * fixedFloat(0.3, 0.2, '-')
     */
    fixedFloat: function (a, b, sign) {
        function handle(x) {
            var y = String(x)
            var p = y.lastIndexOf('.')
            if (p === -1) {
                return [y, 0]
            } else {
                return [y.replace('.', ''), y.length - p - 1]
            }
        }
        // v 操作数1, w 操作数2, s 操作符, t 精度
        function operate(v, w, s, t) {
            switch (s) {
                case '+': return (v + w) / t
                case '-': return (v - w) / t
                case '*': return (v * w) / (t * t)
                case '/': return (v / w)
            }
        }

        var c = handle(a)
        var d = handle(b)
        var k = 0

        if (c[1] === 0 && d[1] === 0) {
            return operate(+c[0], +d[0], sign, 1)
        } else {
            k = Math.pow(10, Math.max(c[1], d[1]))
            if (c[1] !== d[1]) {
                if (c[1] > d[1]) {
                    d[0] += this.padding0(c[1] - d[1])
                } else {
                    c[0] += this.padding0(d[1] - c[1])
                }
            }
            return operate(+c[0], +d[0], sign, k)
        }
    }
};

module.exports=util;

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!