javascript 小数乘法结果错误的处理方法


Posted in Javascript onJuly 28, 2016

一、用js计算

12.32 * 7  结果是多少?
答案:86.24000000000001
 
为什么会出现这种问题?怎么解决?
js在处理小数的乘除法的时候有一个bug,解决的方法可以是:将小数变为整数来处理。
以上的计算可以改为:
12.32 * 100 * 7 /100
得出的结果是:86.24,正确。
 
另外再计算一下:
8.80 * 100 * 12 / 100
结果:105.60000000000002
38.80也会出现类似的问题。
 
精确度增加10倍:
8.80 * 1000 * 12 / 1000
结果:105.6
正常了。
 
16.40 * 1000000 * 6 / 1000000
结果也有问题
 
为了让js执行的更准确,在以后的js小数计算中直接将值扩大10000倍,再除以10000,就可以解决问题。
var num = 38.80;
var num2 = 13;
alert(num * 10000 * 12 / 10000);
 
被乘和除的这个数经过测试10000最合适,小了有些数字出问题,大了(1000000)有些数字也出问题。

二、

<script>
Number.prototype.rate=function(){
varoStr=this.toString();
if(oStr.indexOf(".")==-1)
return1;
else
returnMath.pow(10,parseInt(oStr.length-oStr.indexOf(".")-1));
}
 
functiontran(){
args=tran.arguments;
vartemp=1;
for(i=0;i<args.length;i++)
temp*=args[i]*args[i].rate();
for(i=0;i<args.length;i++)
temp/=args[i].rate();
returntemp
}
 
alert(tran(11,22.9));
 
</script>

该解决 办法是比较麻烦的办法,但是却能让你大概了解解决这个问题的实际过程。

//除法函数,用来得到精确的除法结果
//说明: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);
}

以上这篇javascript 小数乘法结果错误的处理方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
学习YUI.Ext 第二天
Mar 10 Javascript
防止动态加载JavaScript引起的内存泄漏问题
Oct 08 Javascript
ExtJs grid行 右键菜单的两种方法
Jun 19 Javascript
javascript自定义的addClass()方法
May 28 Javascript
JavaScript实现继承的4种方法总结
Oct 16 Javascript
浅谈javascript中的DOM方法
Jul 16 Javascript
JS判断是否为JSON对象及是否存在某字段的方法(推荐)
Nov 29 Javascript
JS实现经典的中国地区三级联动下拉菜单功能实例【测试可用】
Jun 06 Javascript
在vue中使用公共过滤器filter的方法
Jun 26 Javascript
iView-admin 动态路由问题的解决方法
Oct 03 Javascript
微信小程序wx.navigateTo中events属性实现页面间通信传值,数据同步
Jul 13 Javascript
nuxt踩坑之Vuex状态树的模块方式使用详解
Sep 06 Javascript
轮播的简单实现方法
Jul 28 #Javascript
关于JS变量和作用域详解
Jul 28 #Javascript
jquery轮播的实现方式 附完整实例
Jul 28 #Javascript
AngularJS入门教程中SQL实例详解
Jul 27 #Javascript
AngularJS入门教程之表格实例详解
Jul 27 #Javascript
基于jQuery实现仿微博发布框字数提示
Jul 27 #Javascript
AngularJS入门教程之Select(选择框)详解
Jul 27 #Javascript
You might like
详解php中的implements 使用
2017/06/13 PHP
如何简单地用YUI做JavaScript动画
2007/03/10 Javascript
JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
2008/11/03 Javascript
修改jquery里的dialog对话框插件为框架页(iframe) 的方法
2010/09/14 Javascript
js中 关于undefined和null的区别介绍
2013/04/16 Javascript
Jquery获取元素的父容器对象示例代码
2014/02/10 Javascript
jQuery UI设置固定日期选择特效代码分享
2015/08/27 Javascript
jQuery ajax 当async为false时解决同步操作失败的问题
2016/11/18 Javascript
jQuery 出现Cannot read property ‘msie’ of undefined错误的解决方法
2016/11/23 Javascript
你不知道的 javascript【推荐】
2017/01/08 Javascript
jquery网页加载进度条的实现
2017/06/01 jQuery
JS仿QQ好友列表展开、收缩功能(第一篇)
2017/07/07 Javascript
5 种JavaScript编码规范
2018/01/30 Javascript
nodejs dgram模块广播+组播的实现示例
2019/11/04 NodeJs
Jquery异步上传文件代码实例
2019/11/13 jQuery
JavaScript enum枚举类型定义及使用方法
2020/05/15 Javascript
Vue + ts实现轮播插件的示例
2020/11/10 Javascript
[56:18]VGJ.S vs Secret 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python实现截屏的函数
2015/07/26 Python
python fabric实现远程部署
2017/01/05 Python
centos6.7安装python2.7.11的具体方法
2017/01/16 Python
python+selenium打印当前页面的titl和url方法
2018/06/22 Python
Pandas Shift函数的基础入门学习笔记
2018/11/16 Python
Python面向对象之类的定义与继承用法示例
2019/01/14 Python
Django3.0 异步通信初体验(小结)
2019/12/04 Python
flask 使用 flask_apscheduler 做定时循环任务的实现
2019/12/10 Python
一文轻松掌握python语言命名规范规则
2020/06/18 Python
西铁城美国官方网站:Citizen Watch美国
2019/11/08 全球购物
SQL Server面试题
2016/10/17 面试题
学生鉴定评语大全
2014/05/05 职场文书
材料专业大学毕业生自荐书
2014/07/02 职场文书
2014年扶贫工作总结
2014/11/18 职场文书
婚礼女方父母答谢词
2015/01/04 职场文书
催款通知书范文
2015/04/17 职场文书
小学生暑假生活总结
2015/07/13 职场文书
JS实现简单控制视频播放倍速的实例代码
2021/04/18 Javascript