javascript(js)的小数点乘法除法问题详解


Posted in Javascript onMarch 07, 2014

一、用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 defer>
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计算在UTF-8下存储字符串占用字节数
Aug 08 Javascript
浏览器页面区域大小的js获取方法
Sep 21 Javascript
jQuery+HTML5实现手机摇一摇换衣特效
Jun 05 Javascript
详解AngularJS中的作用域
Jun 17 Javascript
简单实现限制uploadify上传个数
Nov 16 Javascript
JavaScript动态创建div等元素实例讲解
Jan 06 Javascript
js计算系统当前日期是星期几的方法
Jul 14 Javascript
AngularJS 实现点击按钮获取验证码功能实例代码
Jul 13 Javascript
微信小程序 动画的简单实例
Oct 12 Javascript
jquery实现二级导航下拉菜单效果实例
May 14 jQuery
React Hooks 实现和由来以及解决的问题详解
Jan 17 Javascript
Vue组件模板及组件互相引用代码实例
Mar 11 Javascript
jquery中常用的函数和属性详细解析
Mar 07 #Javascript
jquery 操作两个select实现值之间的互相传递
Mar 07 #Javascript
JS判断文本框内容改变事件的简单实例
Mar 07 #Javascript
使用js判断TextBox控件值改变然后出发事件
Mar 07 #Javascript
jquery1.10给新增元素绑定事件的方法
Mar 06 #Javascript
jquery单行文字向上滚动效果示例
Mar 06 #Javascript
Javscript删除数组中指定元素并返回新数组
Mar 06 #Javascript
You might like
PHP获取网址的顶级域名函数代码
2012/09/24 PHP
php上传图片到指定位置路径保存到数据库的具体实现
2013/12/30 PHP
php获取四位字母和数字的随机数的实现方法
2015/01/09 PHP
PHP使用mysql_fetch_row查询获得数据行列表的方法
2015/03/18 PHP
php使用指定字符列表生成随机字符串的方法
2015/04/18 PHP
yii2.0实现验证用户名与邮箱功能
2015/12/22 PHP
jquery multiSelect 多选下拉框
2010/07/09 Javascript
js实现页面转发功能示例代码
2013/08/05 Javascript
jquery中的on方法使用介绍
2013/12/29 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
2014/09/22 Javascript
jQuery实现表格展开与折叠的方法
2015/05/04 Javascript
jquery插件NProgress.js制作网页加载进度条
2015/06/05 Javascript
JQuery中DOM实现事件移除的方法
2015/06/13 Javascript
简介AngularJS中使用factory和service的方法
2015/06/17 Javascript
深入浅析JavaScript系列(13):This? Yes,this!
2016/01/05 Javascript
三个js循环的关键字示例(for与while)
2016/02/16 Javascript
Bootstrap布局组件教程之Bootstrap下拉菜单
2016/06/12 Javascript
input type=file 选择图片并且实现预览效果的实例
2017/10/26 Javascript
vue 使用Jade模板写html,stylus写css的方法
2018/02/23 Javascript
angularjs 获取默认选中的单选按钮的value方法
2018/02/28 Javascript
Bootstrap模态对话框用法简单示例
2018/08/31 Javascript
基于JavaScript实现单例模式
2019/10/30 Javascript
python查询mysql中文乱码问题
2014/11/09 Python
Python中tell()方法的使用详解
2015/05/24 Python
windows及linux环境下永久修改pip镜像源的方法
2016/11/28 Python
python 实现GUI(图形用户界面)编程详解
2019/07/17 Python
简单了解python中的f.b.u.r函数
2019/11/02 Python
使用Python制作缩放自如的圣诞老人(圣诞树)
2019/12/25 Python
python使用ctypes调用扩展模块的实例方法
2020/01/28 Python
Python代码注释规范代码实例解析
2020/08/14 Python
Python爬虫破解登陆哔哩哔哩的方法
2020/11/17 Python
美国汽车交易网站:Edmunds
2016/08/17 全球购物
房地产出纳岗位职责
2013/12/01 职场文书
升职演讲稿范文
2014/05/23 职场文书
工地标语大全
2014/06/18 职场文书
青年志愿者服务活动总结
2015/05/06 职场文书