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 相关文章推荐
任意位置显示html菜单
Feb 01 Javascript
JS 表单验证大全
Nov 23 Javascript
jquery快捷动态绑定键盘事件的操作函数代码
Oct 17 Javascript
javascript数组输出的两种方式
Jan 13 Javascript
javascript每日必学之运算符
Feb 16 Javascript
JSON字符串转换JSONObject和JSONArray的方法
Jun 03 Javascript
JQuery组件基于Bootstrap的DropDownList(完整版)
Jul 05 Javascript
Vue用v-for给src属性赋值的方法
Mar 03 Javascript
Vue Element UI + OSS实现上传文件功能
Jul 31 Javascript
vue flex 布局实现div均分自动换行的示例代码
Aug 05 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
Aug 19 Javascript
Vue3 响应式侦听与计算的实现
Nov 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+MSSQL分页的例子
2006/10/09 PHP
mysql数据库差异比较的PHP代码
2012/02/05 PHP
如何在HTML 中嵌入 PHP 代码
2015/05/13 PHP
PHP-FPM运行状态的实时查看及监控详解
2016/11/18 PHP
PHP预定义超全局数组变量小结
2018/08/20 PHP
实例讲解PHP中使用命名空间
2019/01/27 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
js中根据字数截取字符串,不能截断url
2012/01/12 Javascript
node.js中的fs.futimes方法使用说明
2014/12/17 Javascript
js获取数组的最后一个元素
2015/04/14 Javascript
JS实现仿google、百度搜索框输入信息智能提示的实现方法
2015/04/20 Javascript
javascript如何操作HTML下拉列表标签
2015/08/20 Javascript
深入浅析knockout源码分析之订阅
2016/07/12 Javascript
详解Angular-cli生成组件修改css成less或sass的实例
2017/07/27 Javascript
bootstrap modal+gridview实现弹出框效果
2017/08/15 Javascript
vue源码学习之Object.defineProperty 对数组监听
2018/05/30 Javascript
JS实现键值对遍历json数组功能示例
2018/05/30 Javascript
为什么要使用Vuex的介绍
2019/01/19 Javascript
环形加载进度条封装(Vue插件版和原生js版)
2019/12/04 Javascript
[01:21]DOTA2新纪元-7.0新版本即将开启!
2016/12/11 DOTA
[56:21]LGD vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python使用socket进行简单网络连接的方法
2015/04/29 Python
Django中模版的子目录与include标签的使用方法
2015/07/16 Python
在Python的Django框架中更新数据库数据的方法
2015/07/17 Python
python+selenium实现163邮箱自动登陆的方法
2017/12/31 Python
Python控制Firefox方法总结
2019/06/03 Python
python跳出双层for循环的解决方法
2019/06/24 Python
python导包的几种方法(自定义包的生成以及导入详解)
2019/07/15 Python
Python 实现的 Google 批量翻译功能
2019/08/26 Python
pandas read_excel()和to_excel()函数解析
2019/09/19 Python
自我鉴定怎么写
2014/01/12 职场文书
加多宝凉茶广告词
2014/03/18 职场文书
说好普通话圆梦你我他演讲稿
2014/09/21 职场文书
单位租房协议书样本
2014/10/30 职场文书
MySQL系列之十三 MySQL的复制
2021/07/02 MySQL
无线电知识基础入门篇
2022/02/18 无线电