JS小数运算出现多为小数问题的解决方法


Posted in Javascript onJune 02, 2016

写在前面的话:

今天帮同事解决了一个问题,就是小数相乘出现很多位小数的问题;这个问题自己以前也遇到过,现在特意来总结一下;

Number类型:

Number类型是ECMAScript中最常用和最令人关注的类型了;这种类型使用IEEE754格式来表示整数和浮点数值(浮点数值在某些语言中也被成为双精度数值),为支持各种数据类型,ECMA-262定义了不同的数值面量格式。

十进制:
var intNum=10; //整数

八进制:
var octalNum1=070; //八进制的56
var octalNum2=079; //无效的八进制数值-解析为79

八进制字面量在严格模式下是无效的;

十六进制:
var hexNum1=0xA; //10
切记:在进行运算的时候,所有以八进制和十六进制表示的数值都最终被转换成十进制;
为什么操作小数会出现误差?
浮点数值的最高进度是17位小数,但在进行运算的时候其精确度却远远不如整数;整数在进行运算的时候都会转成10进制; 而Java和JavaScript中计算小数运算时,都会先将十进制的小数换算到对应的二进制,一部分小数并不能完整的换算为二进制,这里就出现了第一次的误差。待小数都换算为二进制后,再进行二进制间的运算,得到二进制结果。然后再将二进制结果换算为十进制,这里通常会出现第二次的误差。
所以(0.1+0.2)!=03

解决方式:

程序代码
除法函数,用来得到精确的除法结果
说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
调用:accDiv(arg1,arg2)
返回值:arg1除以arg2的精确结果

function accDiv(arg1,arg2){ 
var t1=0,t2=0,r1,r2; 
try{
t1=arg1.toString().split(".")[1].length}catch(e){
 }try{
 t2=arg2.toString().split(".")[1].length}catch(e){} 
 with(Math){ 
 r1=Number(arg1.toString().replace(".","")) 
 r2=Number(arg2.toString().replace(".","")) 
return (r1/r2)*pow(10,t2-t1);
}
}

给Number类型增加一个div方法,调用起来更加方便。

Number.prototype.div = function (arg){ 
return accDiv(this, arg); 
}

乘法函数,用来得到精确的乘法结果
说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
调用:accMul(arg1,arg2)
返回值:arg1乘以arg2的精确结果

function accMul(arg1,arg2){ 
var m=0,s1=arg1.toString(),
s2=arg2.toString(); 
try{
m+=s1.split(".")[1].length}catch(e){} 
try{
m+=s2.split(".")[1].length}catch(e){} 
return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m
)}

给Number类型增加一个mul方法,调用起来更加方便。

Number.prototype.mul = function (arg){ 
return accMul(arg, this);
}

加法函数,用来得到精确的加法结果
说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
调用:accAdd(arg1,arg2)
返回值:arg1加上arg2的精确结果

function accAdd(arg1,arg2){ 
var r1,r2,m; 
try{
r1=arg1.toString().split(".")[1].length
}catch(e){
r1=0} try{
r2=arg2.toString().split(".")[1].length}catch(e){r2=0} m=Math.pow(10,Math.max(r1,r2)) 
return (arg1*m+arg2*m)/m
}

给Number类型增加一个add方法,调用起来更加方便。

Number.prototype.add = function (arg){ 
return accAdd(arg,this);
}

在你要用的地方包含这些函数,然后调用它来计算就可以了。

比如你要计算:7*0.8 ,则改成 (7).mul(8)

其它运算类似,就可以得到比较精确的结果。
解决方式二:
比较常用的办法,toFixed(),toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。在我们计算的结果后面加上这个方法就OK了;但是对精度会有一丝影响,如果精度要求不高的话推荐使用;

Javascript 相关文章推荐
jquery+json 通用三级联动下拉列表
Apr 19 Javascript
40个有创意的jQuery图片、内容滑动及弹出插件收藏集之一
Dec 31 Javascript
jquery创建并行对象或者合并对象的实现代码
Oct 10 Javascript
两个多选select(multiple左右)添加、删除选项和取值实例
May 12 Javascript
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
Aug 05 Javascript
微信支付如何实现内置浏览器的H5页面支付
Sep 25 Javascript
详解vue2.0 使用动态组件实现 Tab 标签页切换效果(vue-cli)
Aug 30 Javascript
zTree jQuery 树插件的使用(实例讲解)
Sep 25 jQuery
详解Webpack多环境代码打包的方法
Aug 03 Javascript
layui 监听表格复选框选中值的方法
Aug 15 Javascript
vue解决弹出蒙层滑动穿透问题的方法
Sep 22 Javascript
如何通过shell脚本自动生成vue文件详解
Sep 10 Javascript
jQuery easyUI datagrid 增加求和统计行的实现代码
Jun 01 #Javascript
jQuery 选择同时包含两个class的元素的实现方法
Jun 01 #Javascript
jquery ezUI 双击行记录弹窗查看明细的实现方法
Jun 01 #Javascript
jquery 实现滚动条下拉时无限加载的简单实例
Jun 01 #Javascript
sencha ext js 6 快速入门(必看)
Jun 01 #Javascript
Bootstrap3.0建站教程(一)之bootstrap表单元素排版
Jun 01 #Javascript
分享一个插件实现水珠自动下落效果
Jun 01 #Javascript
You might like
Mysql的GROUP_CONCAT()函数使用方法
2008/03/28 PHP
CodeIgniter框架数据库事务处理的设计缺陷和解决方案
2014/07/25 PHP
php使用curl打开https网站的方法
2015/06/17 PHP
Apache启动报错No space left on device: AH00023该怎么解决
2015/10/16 PHP
基于jquery的loading效果实现代码
2010/11/05 Javascript
获取offsetTop和offsetLeft值的js代码(兼容)
2013/04/16 Javascript
禁止IE用右键的JS代码
2013/12/30 Javascript
js实现iframe跨页面调用函数的方法
2014/12/13 Javascript
纯JavaScript代码实现移动设备绘图解锁
2015/10/16 Javascript
jQuery生成假加载动画效果
2016/12/01 Javascript
关于foreach循环中遇到的问题小结
2017/05/08 Javascript
深入探究angular2 UI组件之primeNG用法
2017/07/26 Javascript
jQuery擦除插件eraser使用方法详解
2020/01/11 jQuery
package.json中homepage属性的作用详解
2020/03/11 Javascript
如何在vue中使用video.js播放m3u8格式的视频
2021/02/01 Vue.js
[01:53]2016完美“圣”典风云人物:Maybe专访
2016/12/05 DOTA
python的Crypto模块实现AES加密实例代码
2018/01/22 Python
Python实现深度遍历和广度遍历的方法
2019/01/22 Python
wxPython实现绘图小例子
2019/11/19 Python
python 串行执行和并行执行实例
2020/04/30 Python
Python结合Window计划任务监测邮件的示例代码
2020/08/05 Python
CSS3 实现发光边框特效
2020/11/11 HTML / CSS
详解移动端HTML5音频与视频问题及解决方案
2018/08/22 HTML / CSS
世界上最好的威士忌和烈性酒购买网站:The Whisky Exchange
2016/11/20 全球购物
Volcom英国官方商店:美国殿堂级滑板、冲浪、滑雪服装品牌
2019/03/13 全球购物
英国领先的体验日提供商:Buyagift
2019/04/19 全球购物
大整数数相乘的问题
2012/07/22 面试题
成都思必达公司C#程序员招聘面试题
2013/06/26 面试题
自主招生自荐书
2013/11/29 职场文书
优秀学生事迹材料
2014/02/08 职场文书
目标责任书范本
2014/04/16 职场文书
合同协议书格式
2014/04/18 职场文书
新课培训心得体会
2014/09/03 职场文书
《地震中的父与子》教学反思
2016/02/16 职场文书
教你怎么用Python生成九宫格照片
2021/05/20 Python
Django对接elasticsearch实现全文检索的示例代码
2021/08/02 Python