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 相关文章推荐
ajax 文件上传应用简单实现
Mar 03 Javascript
JavaScript异步调用定时方法并停止该方法实现代码
Mar 16 Javascript
jQuery中用dom操作替代正则表达式
Dec 29 Javascript
jquery果冻抖动效果实现方法
Jan 15 Javascript
JavaScript数组Array对象增加和删除元素方法总结
Jan 20 Javascript
jQuery实现渐变下拉菜单的简单方法
Mar 11 Javascript
简易的投票系统以及js刷票思路和方法
Apr 07 Javascript
jQuery simplePage+AJAX plus分页插件用法实例
Feb 17 Javascript
JavaScript判断数字是否为质数的方法汇总
Jun 02 Javascript
JS字符串按逗号和回车分隔的方法
Apr 25 Javascript
vue router路由嵌套不显示问题的解决方法
Jun 17 Javascript
layui表格分页 记录勾选的实例
Sep 02 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
深入解析phpCB批量转换的代码示例
2013/06/27 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
2015/12/30 PHP
PHP如何将XML转成数组
2016/04/04 PHP
详解PHP如何更好的利用PHPstorm的自动提示
2017/08/18 PHP
漂亮的仿flash菜单,来自蓝色经典
2006/06/26 Javascript
js中cookie的使用详细分析
2008/05/28 Javascript
jQuery技巧大放送 学习jquery的朋友可以看下
2009/10/14 Javascript
jQuery 动态酷效果实现总结
2009/12/27 Javascript
Javascript创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
2010/06/28 Javascript
关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
2010/12/08 Javascript
js中Image对象以及对其预加载处理示例
2013/11/20 Javascript
Webpack 实现 AngularJS 的延迟加载
2016/03/02 Javascript
动态设置form表单的action属性的值的简单方法
2016/05/25 Javascript
简单实现js间歇或无缝滚动效果
2016/06/29 Javascript
AngularJS 获取ng-repeat动态生成的ng-model值实例详解
2016/11/29 Javascript
AngularJS实现tab选项卡的方法详解
2017/07/05 Javascript
详解基于vue-router的动态权限控制实现方案
2017/09/28 Javascript
vue.js实现二级菜单效果
2019/10/19 Javascript
python实现从web抓取文档的方法
2014/09/26 Python
Java Web开发过程中登陆模块的验证码的实现方式总结
2016/05/25 Python
python中异常报错处理方法汇总
2016/11/20 Python
Python算法之图的遍历
2017/11/16 Python
python函数式编程学习之yield表达式形式详解
2018/03/25 Python
Pycharm 2019 破解激活方法图文详解
2019/10/11 Python
Centos7 下安装最新的python3.8
2019/10/28 Python
django创建超级用户时指定添加其它字段方式
2020/05/14 Python
django日志默认打印request请求信息的方法示例
2020/05/17 Python
类、抽象类、接口的差异
2016/06/13 面试题
公司薪酬管理制度
2014/01/31 职场文书
小区消防演习方案
2014/02/21 职场文书
小学生倡议书范文
2014/05/13 职场文书
计生专干事迹
2014/05/28 职场文书
个人批评与自我批评发言稿
2014/09/28 职场文书
先进教育工作者事迹材料
2014/12/23 职场文书
中班下学期个人总结
2015/02/12 职场文书
Python数据处理的三个实用技巧分享
2022/04/01 Python