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 相关文章推荐
经常用的图片在容器中的水平垂直居中实例
Jun 10 Javascript
可兼容IE的获取及设置cookie的jquery.cookie函数方法
Sep 02 Javascript
5款JavaScript代码压缩工具推荐
Jul 07 Javascript
JS响应鼠标点击实现两个滑块区间拖动效果
Oct 26 Javascript
Js查找字符串中出现次数最多的字符及个数实例解析
Sep 05 Javascript
JavaScript中this的四个绑定规则总结
Sep 26 Javascript
js实现表单提交后不重新刷新当前页面
Nov 30 Javascript
jquery实现下拉框多选方法介绍
Jan 03 Javascript
jQuery的时间datetime控件在AngularJs中的使用实例(分享)
Aug 17 jQuery
vue实现页面加载动画效果
Sep 19 Javascript
VUE2 前端实现 静态二级省市联动选择select的示例
Feb 09 Javascript
JS 验证码功能的三种实现方式
Nov 26 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利用正则表达式解决采集内容排版的问题
2013/06/20 PHP
php图片水印添加、压缩、剪切的封装类实现
2020/04/18 PHP
php 浮点数比较方法详解
2017/05/05 PHP
JavaScript中的事件处理
2008/01/16 Javascript
从零开始学习jQuery (二) 万能的选择器
2010/10/01 Javascript
判断对象是否Window的实现代码
2012/01/10 Javascript
Javascript 拖拽的一些高级的应用(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
JavaScript实现仿网易通行证表单验证
2015/05/25 Javascript
javascript实现多栏闭合展开式广告位菜单效果实例
2015/08/05 Javascript
ionic 上拉菜单(ActionSheet)实例代码
2016/06/06 Javascript
JS实现的自定义显示加载等待图片插件(loading.gif)
2016/06/17 Javascript
对jQuary选择器的全面总结
2016/06/20 Javascript
基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)
2016/09/02 Javascript
在js中实现邮箱格式的验证方法(推荐)
2016/10/24 Javascript
JavaScript的兼容性与调试技巧
2016/11/22 Javascript
jQuery插件FusionCharts绘制的2D双面积图效果示例【附demo源码】
2017/04/11 jQuery
JS中Attr的用法详解
2017/10/09 Javascript
angularJs select绑定的model取不到值的解决方法
2018/10/08 Javascript
NodeJS 将文件夹按照存放路径变成一个对应的JSON的方法
2018/10/17 NodeJs
小程序点击图片实现自动播放视频
2020/05/29 Javascript
使用nvm和nrm优化node.js工作流的方法
2019/01/17 Javascript
jstree中的checkbox默认选中和隐藏示例代码
2019/12/29 Javascript
Javascript模拟实现new原理解析
2020/03/03 Javascript
将Python代码打包为jar软件的简单方法
2015/08/04 Python
python实现画一颗树和一片森林
2018/06/25 Python
如何使用 Python 读取文件和照片的创建日期
2020/09/05 Python
双立人加拿大官网:Zwilling加拿大
2020/08/10 全球购物
医药个人求职信范文
2014/01/29 职场文书
营销总经理岗位职责
2014/02/02 职场文书
档案室主任岗位职责
2014/02/12 职场文书
实习护士自荐信
2014/06/21 职场文书
交通事故委托书范本(2篇)
2014/09/21 职场文书
大专护理专业自荐信
2015/03/25 职场文书
解决Go gorm踩过的坑
2021/04/30 Golang
python缺失值的解决方法总结
2021/06/09 Python