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 相关文章推荐
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
Feb 05 Javascript
jquery1.4后 jqDrag 拖动 不可用
Feb 06 Javascript
javascript为按钮注册回车事件(设置默认按钮)的方法
May 09 Javascript
基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转
Jun 12 Javascript
js 获取范围内的随机数实例代码
Aug 02 Javascript
通过sails和阿里大于实现短信验证
Jan 04 Javascript
jQuery时间验证和转换为标准格式的时间格式
Mar 06 Javascript
基于Bootstrap模态对话框只加载一次 remote 数据的解决方法
Jul 09 Javascript
Vuejs+vue-router打包+Nginx配置的实例
Sep 20 Javascript
JS实现导航栏楼层特效
Jan 01 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
Oct 31 Javascript
javascript实现点击产生随机图形
Jan 25 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/05/07 PHP
PHP中防止直接访问或查看或下载config.php文件的方法
2012/07/07 PHP
浅谈ThinkPHP中initialize和construct的区别
2017/04/01 PHP
JS滚轮事件onmousewheel使用介绍
2013/11/01 Javascript
前端轻量级MVC框架CanJS详解
2014/09/26 Javascript
如何调试异步加载页面里包含的js文件
2014/10/30 Javascript
jQuery处理json数据返回数组和输出的方法
2015/03/11 Javascript
jQuery中animate动画第二次点击事件没反应
2015/05/07 Javascript
JavaScript操作Cookie方法实例分析
2015/05/27 Javascript
jquery实现点击label的同时触发文本框点击事件的方法
2015/06/05 Javascript
tuzhu_req.js 实现仿百度图片首页效果
2015/08/11 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
bootstrap如何让dropdown menu按钮式下拉框长度一致
2017/04/10 Javascript
es6 字符串String的扩展(实例讲解)
2017/08/03 Javascript
关于JavaScript中高阶函数的魅力详解
2018/09/07 Javascript
微信小程序使用component自定义toast弹窗效果
2018/11/27 Javascript
详解ES6中的Map与Set集合
2019/03/22 Javascript
python 脚本生成随机 字母 + 数字密码功能
2018/05/26 Python
django认证系统实现自定义权限管理的方法
2018/07/16 Python
解决Python下imread,imwrite不支持中文的问题
2018/12/05 Python
基于TensorBoard中graph模块图结构分析
2020/02/15 Python
Python之关于类变量的两种赋值区别详解
2020/03/12 Python
完美解决Django2.0中models下的ForeignKey()问题
2020/05/19 Python
python如何变换环境
2020/07/21 Python
Matplotlib配色之Colormap详解
2021/01/05 Python
如何避免常见的6种HTML5错误用法
2017/11/06 HTML / CSS
HomeAway英国:全球领先的度假租赁在线市场
2020/02/03 全球购物
4s店总经理岗位职责
2013/12/31 职场文书
科研先进个人典型材料
2014/01/31 职场文书
关于学习的演讲稿
2014/05/10 职场文书
2014年领导班子工作总结
2014/12/11 职场文书
就业指导讲座心得体会
2016/01/15 职场文书
2016年公司“3.12”植树节活动总结
2016/03/16 职场文书
大学生暑期社会实践的个人总结!
2019/07/17 职场文书
2019大学生社会实践报告汇总
2019/08/16 职场文书
pytorch 6 batch_train 批训练操作
2021/05/28 Python