js计算结果不精确问题解决--math.js的使用
最近在做订单相关的一个功能,涉及到金额的计算,有人建议,将计算全部抛给后端来做吧,前端就不需要再维护一套算法了,话说的在理,但是呢,想想用户体验,单价*数量=金额,当用户改变一个数量时,用户都口算出来金额了,然而页面还在请求的loading中,这也太.......
于是乎,我决定前端也维护一套算法,给用户最快的响应.页面大致如下:
正常来说,这完全不是个事,很快就全部按要求实现 了,然而,测试过程中,发现了下图:
什么? 0.14*100=14.0000000000000002 ???
开发这么多年,真的第一次遇到,于是乎开始了各种测试,各种查阅,原来是这样啊:
js计算时,会将十进制转换成二进制,再进行计算,但有些小数转换成二进制时候,出现了无限循环,由于位数有限,所以就出现了截取,所以就导致了再转化成十进制后结果的不精确.所以就出现了: 0.1+0.2 !== 0.3
不说这些废话了,直接来解决方案:
math.js 是一款功能强大,使用灵活的数学库。不过此处我只需使用加减乘除等简单的方法,需要更多者可以查阅官网
1,引入第三方的js库, math.js,
math.js的下载地址是:
https://cdnjs.cloudflare.com/ajax/libs/mathjs/5.0.0/math.js。
2,在程序入口处统一配置以下math.js,
//统一配置math.js
math.config({
number: 'BigNumber',
// 'number' (default),
precision: 20
});
3,使用mathjs里的运算方式改写计算公式:比如,以前的的金额计算如下:
改写之后为:
//使用math.js转换数据类型
item.listPrice = math.bignumber(item.listPrice) ; //计算金额:金额=列表价*数量
var amountOfBigNumber = item.listPrice * item.orderNum; //转换结果类型,提取数字(不转的话,得到的是对象)
item.amount = math.number(amountOfBigNumber);
这样就不会出现误差,结果就能正常了,即 0.14 * 100 = 14 !
注:常用的几个运算方法是:
| 运算 | 方法名 | 参数 | 备注 |
| 加 |
math.add(a,b,c,...)
|
参数个数>=2 | 得到几个数字的和 |
| 减 |
math.subtract(a,b)
|
参数个数=2 | 得到 a-b 的结果, 不可连减 |
| 乘 | math.multiply(a,b,c,...) | 参数个数>=2 | 得几个参数的乘积 |
| 除 |
math.divide(a,b)
|
参数个数=2 | 得到 a/b 的结果 ,不可连除 |
| 转换为bigNumber类型 |
math.bignumber(a)
|
浮点数,进行运算时,转换成bigNumber才能保证得到精确的结果 | |
| 转换为数字类型 |
math.number(a)
|
bignumber为对象,此方法可以获取对象中的数字部分 |

另外,还有以款比较强大的数学库,BigNumber.js,同样能解决我们的问题,有兴趣者可以研究下
js计算结果不精确问题解决--math.js的使用的更多相关文章
- js 计算快速统计中用到的日期
前言 最近在做统计报表模块,其中查询条件用到了快速查询,主要为了方便客户统计查询常用的几个日期纬度,比如本周.上周.本月.上月.昨日. 使用js计算,主要用到了js Date. getDate().g ...
- 使用math.js进行javascript精确计算
javascript进行浮点运算会有尾差,比如算个0.1+0.7试试,得到的不是0.8 .这个问题可以使用math.js解决. Math.js是一款开源的JavaScript和Node.js数学库,用 ...
- js 数值精确运算使用math.js
javaScript 浮点数运算的精度问题 问题:编程中你可能会遇到0.1*7=0.7000000000000001; 原因:几乎所有的编程语言都采用了 IEEE-745 浮点数表示法,任何使用二进制 ...
- js计算2个日期相差的天数,两个日期相差的天数,日期相隔天数
js计算2个日期相差的天数,两个日期相差的天数,日期相隔天数 >>>>>>>>>>>>>>>>>& ...
- js计算日期相差的天数
在网站开发中,经常会遇到计算日期相差的天数,js 没有提供相应的方法,所以自己写一个,方便将来查看: 代码: function DateDiff(sDate1, sDate2, splitStr) { ...
- mathjs,math.js解决js运算精度问题
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- js计算两个日期的天数差值
js计算两个日期的天数差值 通过两个日期计算这两个日期之间的天数差值 /** * 计算天数差的函数,通用 * @param sDate1 * @param sDate2 * @returns {Num ...
- JS计算距当前时间的时间差
/** * JS获取距当前时间差 * * @param int time JS毫秒时间戳 * */ function get_time_diff(time) { var diff = ''; var ...
- JS计算两个日期之间的天数
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
随机推荐
- git常用命名:自用,持续更新
1.切换分支 git checkout -b dev origin/feature/迭代1.1 2.提交本地代码到github git init //初始化git git config --globa ...
- 【大数据应用期末总评】Hadoop综合大作业
作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3339 一.Hadoop综合大作业 要求: 1.将爬虫大作业产生的csv ...
- Linux安装问题解决
首先安装VM,之后下载centos7.5 安装好vm后运行时无法执行操作 提示 已将该虚拟机配置为使用 64 位客户机操作系统.但是,无法执行 64 位操作. 此主机支持 Intel VT-x,但 I ...
- spring-JDBC模板
Spring的JDBC的模板 Spring是EE开发的一站式的框架,有EE开发的每层的解决方案. Spring对持久层也提供了解决方案:ORM模块和JDBC的模板. Spring提供了很多的模板用于简 ...
- 最近b站好像把blv格式换成m4s,改成mp4之后没有声音,
我研究了几个小时,然后知道一个方法,但是必须有电脑.1.m4s 的视频改为mp4可以拖进pr2.m4s的音频不能直接拖进pr(会报错),改为mp3也一样,要先改为mp3,然后在格式工厂里面选择,mp3 ...
- Java基础 switch 简单示例
JDK :OpenJDK-11 OS :CentOS 7.6.1810 IDE :Eclipse 2019‑03 typesetting :Markdown code ...
- Pandas进阶之DataFrame多级索引
多级索引:在一个轴上有多个(两个以上)的索引,能够以低维度形式来表示高维度的数据.单级索引是Index对象,多级索引是MultiIndex对象. 一.创建多级索引 方法一:隐式创建,即给DataFra ...
- odoo开发笔记--ValueError Expected singleton
异常处理参考:https://stackoverflow.com/questions/31070640/valueerror-expected-singleton-odoo8 报错: ValueErr ...
- pytorch保证每次运行使用的随机数都相同的方法
其实在代码的开头添加下面几句话即可: # 保证训练时获取的随机数都是一样的 init_seed = torch.manual_seed(init_seed) torch.cuda.manual_see ...
- Python分词工具——pyhanlp
本文为本人学习pyhanlp的笔记,大多知识点来源于GitHubhttps://github.com/hankcs/HanLP/blob/master/README.md,文中的demo代码来源于该G ...