最近在做订单相关的一个功能,涉及到金额的计算,有人建议,将计算全部抛给后端来做吧,前端就不需要再维护一套算法了,话说的在理,但是呢,想想用户体验,单价*数量=金额,当用户改变一个数量时,用户都口算出来金额了,然而页面还在请求的loading中,这也太.......

于是乎,我决定前端也维护一套算法,给用户最快的响应.页面大致如下:

正常来说,这完全不是个事,很快就全部按要求实现 了,然而,测试过程中,发现了下图:

什么?    0.14*100=14.0000000000000002     ???

开发这么多年,真的第一次遇到,于是乎开始了各种测试,各种查阅,原来是这样啊:
js计算时,会将十进制转换成二进制,再进行计算,但有些小数转换成二进制时候,出现了无限循环,由于位数有限,所以就出现了截取,所以就导致了再转化成十进制后结果的不精确.所以就出现了: 0.1+0.2 !== 0.3

不说这些废话了,直接来解决方案:

math.js 是一款功能强大,使用灵活的数学库。不过此处我只需使用加减乘除等简单的方法,需要更多者可以查阅官网

1,引入第三方的js库, math.js,

官网:http://mathjs.org/

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里的运算方式改写计算公式:比如,以前的的金额计算如下:

  item.amount = item.listPrice * item.orderNum;

改写之后为:

 //使用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的使用的更多相关文章

  1. js 计算快速统计中用到的日期

    前言 最近在做统计报表模块,其中查询条件用到了快速查询,主要为了方便客户统计查询常用的几个日期纬度,比如本周.上周.本月.上月.昨日. 使用js计算,主要用到了js Date. getDate().g ...

  2. 使用math.js进行javascript精确计算

    javascript进行浮点运算会有尾差,比如算个0.1+0.7试试,得到的不是0.8 .这个问题可以使用math.js解决. Math.js是一款开源的JavaScript和Node.js数学库,用 ...

  3. js 数值精确运算使用math.js

    javaScript 浮点数运算的精度问题 问题:编程中你可能会遇到0.1*7=0.7000000000000001; 原因:几乎所有的编程语言都采用了 IEEE-745 浮点数表示法,任何使用二进制 ...

  4. js计算2个日期相差的天数,两个日期相差的天数,日期相隔天数

    js计算2个日期相差的天数,两个日期相差的天数,日期相隔天数 >>>>>>>>>>>>>>>>>& ...

  5. js计算日期相差的天数

    在网站开发中,经常会遇到计算日期相差的天数,js 没有提供相应的方法,所以自己写一个,方便将来查看: 代码: function DateDiff(sDate1, sDate2, splitStr) { ...

  6. mathjs,math.js解决js运算精度问题

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. js计算两个日期的天数差值

    js计算两个日期的天数差值 通过两个日期计算这两个日期之间的天数差值 /** * 计算天数差的函数,通用 * @param sDate1 * @param sDate2 * @returns {Num ...

  8. JS计算距当前时间的时间差

    /** * JS获取距当前时间差 * * @param int time JS毫秒时间戳 * */ function get_time_diff(time) { var diff = ''; var ...

  9. JS计算两个日期之间的天数

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

随机推荐

  1. Android中创建自定义控件

    1.创建一个TitleLayout继承LinearLayout: //创建自定义控件 public class TitleLayout extends LinearLayout { private f ...

  2. element ui分页器的使用

    <el-pagination layout="total, prev, pager, next, jumper" :current-page="pageInfo.p ...

  3. durpal安装时The translation server is offline解决

    从https://localize.drupal.org/download下载语言文件上传到 目录/var/www/html/sites/default/files/translations 或者wg ...

  4. CTF RCE(远程代码执行)

    目录 php代码执行 一.相关函数 1.代码注入 2.命令执行 二.命令执行的绕过 1.命令执行的分隔符 2.空格代替 3.绕过 4.命令执行的各种符号 三.命令无回显的情况 1.判断 2.利用 四. ...

  5. hdu1237 简单计算器[STL 栈]

    目录 题目地址 题干 代码和解释 参考 题目地址 hdu1237 题干 代码和解释 解本题时使用了STL 栈,要记得使用#include<stack>. 解本题时使用了isdigit()函 ...

  6. 20189220 余超《Linux内核原理与分析》第六周作业

    系统调用的三层机制 实验过程 1.克隆MenuOS rm menu -rf //强制删除当前menu git clone http://git.shiyanlou.com/mengning/menu. ...

  7. Python中为什么没有++和–(自增/减)(转)

    原文地址:http://blog.csdn.net/guang09080908/article/details/47273775(侵删) 这两天看了一些网上各大互联网公司的面试题,发现腾讯特别喜欢考察 ...

  8. layui的layer.open()方法查看缩略图 原图缩放

    写在前面 需求是页面上的图片缩略图, 鼠标悬浮时显示原图片, 并按比例缩放. 操作步骤 官方文档 点击跳转 关键属性 1. type: 设置type=1, 以页面的形式展示图片 2.  content ...

  9. C语言函数sscanf()的用法-从字符串中读取与指定格式相符的数据(转)

    C语言函数sscanf()的用法 sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int sscanf( string str, string fmt, mixed var ...

  10. 帆软 联合 创始人 数据可视化 中国 发展 FineReport FineBI

    丧心病狂!帆软公司的成立竟源于一个被初恋抛弃的程序员 - 大数据-炼数成金-Dataguru专业数据分析社区http://dataguru.cn/article-7500-1.html 帆软联合创始人 ...