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 相关文章推荐
js 颜色选择器(兼容firefox)
Mar 05 Javascript
Javascript匿名函数的一种应用 代码封装
Jun 27 Javascript
基于jquery的网页SELECT下拉框美化代码
Oct 28 Javascript
js和jquery使按钮失效为不可用状态的方法
Jan 26 Javascript
node.js中的path.sep方法使用说明
Dec 08 Javascript
利用 spin.js 生成等待效果(js 等待效果)
Jun 25 Javascript
vue子父组件通信的实现代码
Jul 09 Javascript
详解RequireJs官方使用教程
Oct 31 Javascript
解决layui前端框架 form表单,table表等内置控件不显示的问题
Aug 19 Javascript
angular2 ng2-file-upload上传示例代码
Aug 23 Javascript
vue实现移动端省市区选择
Sep 27 Javascript
微信小程序上传图片并等比列压缩到指定大小的实例代码
Oct 24 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学习之PHP运算符
2006/10/09 PHP
PHP 伪静态隐藏传递参数名的四种方法
2010/02/22 PHP
yii2超好用的日期组件和时间组件
2016/05/05 PHP
在Laravel中使用DataTables插件的方法
2018/05/29 PHP
Jquery获取复选框被选中值的简单方法
2013/07/04 Javascript
node爬取微博的数据的简单封装库nodeweibo使用指南
2015/01/02 Javascript
深入理解JavaScript编程中的原型概念
2015/06/25 Javascript
jQuery的Scrollify插件实现滑动到页面下一节点
2015/07/05 Javascript
详解Document.Cookie
2015/12/25 Javascript
js事件驱动机制 浏览器兼容处理方法
2016/07/23 Javascript
JavaScript函数柯里化原理与用法分析
2017/03/31 Javascript
详解Vue路由钩子及应用场景(小结)
2017/11/07 Javascript
JavaScript继承与聚合实例详解
2019/01/22 Javascript
微信小程序开发常见问题及解决方案
2019/07/11 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
jQuery实现动态加载瀑布流
2020/09/01 jQuery
swiper自定义分页器的样式
2020/09/14 Javascript
django接入新浪微博OAuth的方法
2015/06/29 Python
python3+PyQt5实现文档打印功能
2018/04/24 Python
python使用knn实现特征向量分类
2018/12/26 Python
我喜欢你 抖音表白程序python版
2019/04/07 Python
python画双y轴图像的示例代码
2019/07/07 Python
Python加速程序运行的方法
2020/07/29 Python
Python通过字典映射函数实现switch
2020/11/06 Python
英国旅行箱包和行李箱购物网站:Travel Luggage & Cabin Bags
2019/08/26 全球购物
database面试题
2013/03/28 面试题
Linux内核的同步机制是什么?主要有哪几种内核锁
2016/07/11 面试题
小学教师的自我评价范例
2013/10/31 职场文书
大学生冰淇淋店商业计划书
2014/01/14 职场文书
家长写给老师的建议书
2014/03/13 职场文书
上课说话检讨书
2015/01/27 职场文书
2015年超市员工工作总结
2015/05/04 职场文书
行为规范主题班会
2015/08/13 职场文书
远程教育培训心得体会
2016/01/09 职场文书
小学英语新课改心得体会
2016/01/22 职场文书
Python爬虫数据的分类及json数据使用小结
2021/03/29 Python