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中类的定义及其方式(《javascript高级程序设计》学习笔记)
Jul 04 Javascript
JavaScript去除数组里重复值的方法
Jul 13 Javascript
理解javascript中Map代替循环
Feb 26 Javascript
jQuery EasyUI Tab 选项卡问题小结
Aug 16 Javascript
JavaScript reduce和reduceRight详解
Oct 24 Javascript
js阻止移动端页面滚动的两种方法
Jan 25 Javascript
Javascript实现购物车功能的详细代码
May 08 Javascript
微信小程序scroll-view的滚动条设置实现
Mar 02 Javascript
15分钟上手vue3.0(小结)
May 20 Javascript
vue 通过 Prop 向子组件传递数据的实现方法
Oct 30 Javascript
利用 JavaScript 构建命令行应用
Nov 17 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
不用GD库生成当前时间的PNG格式图象的程序
2006/10/09 PHP
用PHP发电子邮件
2006/10/09 PHP
PHP基于mssql扩展远程连接MSSQL的简单实现方法
2016/10/08 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
2019/09/02 PHP
设置jsf的选择框h:selectOneMenu为不可编辑状态的方法
2014/01/07 Javascript
javascript中通过arguments参数伪装方法重载
2014/10/08 Javascript
javascript+canvas实现刮刮卡抽奖效果
2015/07/29 Javascript
瀑布流的实现方式(原生js+jquery+css3)
2020/06/28 Javascript
微信小程序 生命周期函数详解
2017/05/24 Javascript
详解微信小程序 通过控制CSS实现view隐藏与显示
2017/05/24 Javascript
Vue实现一个返回顶部backToTop组件
2017/07/25 Javascript
jQuery实现所有验证通过方可提交的表单验证
2017/11/21 jQuery
使用async await 封装 axios的方法
2018/07/09 Javascript
vue-cli监听组件加载完成的方法
2018/09/07 Javascript
在axios中使用params传参的时候传入数组的方法
2018/09/25 Javascript
nodejs 使用 js 模块的方法实例详解
2018/12/04 NodeJs
JS手写一个自定义Promise操作示例
2020/03/16 Javascript
react结合bootstrap实现评论功能
2020/05/30 Javascript
如何实现小程序与小程序之间的跳转
2020/11/04 Javascript
Python向日志输出中添加上下文信息
2017/05/24 Python
python执行使用shell命令方法分享
2017/11/08 Python
Python实现的插入排序算法原理与用法实例分析
2017/11/22 Python
Python3之文件读写操作的实例讲解
2018/01/23 Python
在pycharm中使用git版本管理以及同步github的方法
2019/01/16 Python
Python semaphore evevt生产者消费者模型原理解析
2020/03/18 Python
python中Django文件上传方法详解
2020/08/05 Python
HTML5在a标签内放置块级元素示例代码
2013/08/23 HTML / CSS
捷克建筑材料网上商店:DEK.cz
2021/03/06 全球购物
销售人员自我评价怎么写
2013/09/19 职场文书
创新型城市实施方案
2014/03/06 职场文书
公司授权委托书
2014/10/17 职场文书
音乐教师求职信范文
2015/03/20 职场文书
2016高三毕业赠言寄语
2015/12/04 职场文书
一次MySQL启动导致的事故实战记录
2021/09/15 MySQL
MySQL窗口函数的具体使用
2021/11/17 MySQL
Elasticsearch 数据类型及管理
2022/04/19 Python