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 相关文章推荐
js判断一个元素是否为另一个元素的子元素的代码
Mar 21 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
May 20 Javascript
基于jquery的9行js轻松实现tab控件示例
Oct 12 Javascript
JQuery.get提交页面不跳转的解决方法
Jan 13 Javascript
jQuery实现可用于博客的动态滑动菜单
Mar 09 Javascript
Node.js实现JS文件合并小工具
Feb 02 Javascript
Vue2.0表单校验组件vee-validate的使用详解
May 02 Javascript
JavaScript基于遍历操作实现对象深拷贝功能示例
Mar 05 Javascript
javascript 代码是如何被压缩的示例代码
May 06 Javascript
element日历calendar组件上月、今天、下月、日历块点击事件及模板源码
Jul 27 Javascript
vue3+typescript实现图片懒加载插件
Oct 26 Javascript
微信小程序实现多行文字滚动
Nov 18 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 自定义错误处理函数的使用详解
2013/05/10 PHP
PHP Cookie的使用教程详解
2013/06/03 PHP
CodeIgniter CLI模式简介
2014/06/17 PHP
PHP实现的下载远程图片自定义函数分享
2015/01/28 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
2016/07/07 PHP
用JS做的简单的可折叠的两级树形菜单
2013/09/21 Javascript
jQuery设置div一直在页面顶部显示的方法
2013/10/24 Javascript
JQuery复制DOM节点的方法
2015/06/11 Javascript
NodeJS创建基础应用并应用模板引擎
2016/04/12 NodeJs
jquery实现简单Tab切换菜单效果
2020/07/17 Javascript
AngularJS基础 ng-dblclick 指令用法
2016/08/01 Javascript
详谈Angular路由与Nodejs路由的区别
2017/03/05 NodeJs
javascript中mouseenter与mouseover的异同
2017/06/06 Javascript
用jQuery将JavaScript对象转换为querystring查询字符串的方法
2018/11/12 jQuery
小程序登录态管理的方法示例
2018/11/13 Javascript
详解vue 在移动端体验上的优化解决方案
2019/05/20 Javascript
使用Vue实现简单计算器
2020/02/25 Javascript
vue-列表下详情的展开与折叠案例
2020/07/28 Javascript
[38:23]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第二场 11.01
2020/11/02 DOTA
Python 读取图片文件为矩阵和保存矩阵为图片的方法
2018/04/27 Python
Python批处理更改文件名os.rename的方法
2018/10/26 Python
在Python中pandas.DataFrame重置索引名称的实例
2018/11/06 Python
Python网络爬虫四大选择器用法原理总结
2020/06/01 Python
娇韵诗法国官网:Clarins法国
2019/01/29 全球购物
Regatta官网:英国最受欢迎的户外服装和鞋类品牌
2019/05/01 全球购物
德国50岁以上交友网站:Lebensfreunde
2020/03/18 全球购物
校园歌手大赛策划书
2014/01/17 职场文书
企业金融服务方案
2014/06/03 职场文书
红色经典电影观后感
2015/06/18 职场文书
2016年毕业实习心得体会范文
2015/10/09 职场文书
Mac环境Nginx配置和访问本地静态资源的实现
2021/03/31 Servers
Python控制台输出俄罗斯方块的方法实例
2021/04/17 Python
用Python爬取英雄联盟的皮肤详细示例
2021/12/06 Python
一条 SQL 语句执行过程
2022/03/17 MySQL
MySQL Server层四个日志的实现
2022/03/31 MySQL
vue route新窗口跳转页面并且携带与接收参数
2022/04/10 Vue.js