博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js浮点数的计算
阅读量:5049 次
发布时间:2019-06-12

本文共 2048 字,大约阅读时间需要 6 分钟。

    js在计算浮点数时可能不够准确,会产生舍入误差的问题,这是使用基于IEEE745数值的浮点计算的通病,并非ECMAScript一家,其他使用相同数值格式的语言也存在这个问题。

    这里讲一下js浮点数加、减、乘、除的正确做法。

乘法运算

    整数的乘法运算是准确的,这里我们将浮点数的乘法运算转化为整数乘法,然后除以10的他们小数位数之和次方,如0.03乘以0.05,转化为3 * 5 / 1e4

//乘法运算 0.03  * 0.05 变成3 * 5 / 10^4    function mul(a, b) {        var n = 0;        var c = a.toString(10);        var d = b.toString(10);        try {            n += c.split('.')[1].length;        } catch (f) {}        try {            n += d.split('.')[1].length;        } catch (f) {}        return (+c.replace('.', '')) * (+d.replace('.', '')) / Math.pow(10, n);    }

加法运算

    这里我们将浮点数分别乘以小数位最大的之后,再相加,然后除以10的小数位数最大的次方,如0.03加上0.5,转化为3 + 50 / 1e2

//加法运算    function add(a, b) {        var c, d, n;                try {            c = (a + '').split('.')[1].length;        } catch(f) {            c = 0;        }        try {            d = (b + '').split('.')[1].length;        } catch(f) {            d = 0;        }        return e = Math.pow(10, Math.max(c, d)), (a * e + b * e)/ e;    }

减法运算

    同加法,如0.03减去0.5,转化为3 - 50 / 1e2

//除法运算    function sub(a, b) {        var c, d, n;                try {            c = (a + '').split('.')[1].length;        } catch(f) {            c = 0;        }        try {            d = (b + '').split('.')[1].length;        } catch(f) {            d = 0;        }        return e = Math.pow(10, Math.max(c, d)), (a * e - b * e) / e;    }

除法运算

    也类似加法,将两个数各自乘以10的他们小数位最大的次方,再相除,然后乘以1e(除数小数位 - 被除数小数位)0.03除以0.5,转化为3 / 50再乘以1e-1

//除法运算function dev(a, b) {        var c, d, e, f;        try {            c = (a + '').split('.')[1].length;        } catch (f) {            c = 0;        }        try {            d = (b + '').split('.')[1].length;        } catch (f) {            d = 0;        }        return e = (a + '').replace('.', '') , f = (b + '').replace('.', ''), mul(e / f, Math.pow(10, d - c));    }

测试代码:

console.log(sub(0.03, 0.5));//-0.2    console.log(add(0.03, 0.5));//0.53    console.log(mul(0.03, 0.5));//0.015    console.log(dev(0.03, 0.5));//0.06

输出结果 :

949634-20160831230309793-1276467643.png

转载于:https://www.cnblogs.com/DaisyWang/p/5827914.html

你可能感兴趣的文章
Debugger Exception Notification
查看>>
选择排序
查看>>
Restful Api 最佳实践
查看>>
vue - .babelrc
查看>>
Shell test 命令
查看>>
css 权威指南笔记( 五)结构和层叠
查看>>
Linux下vim上编辑实现进度条
查看>>
(转)图解SSH原理
查看>>
oracle的to_number、to_char、to_date用法
查看>>
你不知道的Google应用
查看>>
10.文件的输入输出、异常
查看>>
Hashtable, ArrayList, List, Dictionary学习[转]
查看>>
sqlserver日志的备份与还原
查看>>
从基本功能看,DX11.1相对11的改变,与硬件特性无关
查看>>
PHP时间日期操作增减(date strtotime) 加一天 加一月
查看>>
Baseline
查看>>
tcp断开的4次挥手
查看>>
system.data.sqlite的源代码下载
查看>>
特酷消隐字体
查看>>
通过键盘控制改变物体transform值
查看>>