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 相关文章推荐
JavaScript DOM 学习第九章 选取范围的介绍
Feb 19 Javascript
Date对象格式化函数代码
Jul 17 Javascript
jquery 学习之二 属性相关
Nov 23 Javascript
从面试题学习Javascript 面向对象(创建对象)
Mar 30 Javascript
jQuery实现随意改变div任意属性的名称和值(部分原生js实现)
May 28 Javascript
jQuery的attr与prop使用介绍
Oct 10 Javascript
jQuery中ajax的使用与缓存问题的解决方法
Dec 19 Javascript
JavaScript运行机制之事件循环(Event Loop)详解
Oct 10 Javascript
Node.js与MySQL交互操作及其注意事项
Oct 05 Javascript
jQuery 选择符详细介绍及整理
Dec 02 Javascript
VueJs 搭建Axios接口请求工具
Nov 20 Javascript
Vue监听一个数组id是否与另一个数组id相同的方法
Sep 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中对数据库操作的封装
2006/10/09 PHP
php中去除所有js,html,css代码
2010/10/12 PHP
php查看请求头信息获取远程图片大小的方法分享
2013/12/25 PHP
将PHP从5.3.28升级到5.3.29时Nginx出现502错误
2015/05/09 PHP
PHP正则替换函数preg_replace()报错:Notice Use of undefined constant的解决方法分析
2017/02/04 PHP
PHP实现对xml的增删改查操作案例分析
2017/05/19 PHP
CodeIgniter框架数据库基本操作示例
2018/05/24 PHP
PHP PDOStatement::execute讲解
2019/01/31 PHP
采用call方式实现js继承
2014/05/20 Javascript
jquery实现可自动判断位置的弹出层效果代码
2015/10/12 Javascript
JavaScript中有关一个数组中最大值和最小值及它们的下表的输出的解决办法
2016/07/01 Javascript
AngularJS 路由详解和简单实例
2016/07/28 Javascript
前端分页功能的实现以及原理(jQuery)
2017/01/22 Javascript
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
2017/08/01 jQuery
详解用Node.js实现Restful风格webservice
2017/09/29 Javascript
解决layui弹出层layer的area过大被遮挡的问题
2019/09/21 Javascript
Vue自定义多选组件使用详解
2020/09/08 Javascript
js实现淘宝浏览商品放大镜功能
2020/10/28 Javascript
[01:50]2014DOTA2西雅图邀请赛 专访欢乐周宝龙
2014/07/08 DOTA
浅谈终端直接执行py文件,不需要python命令
2017/01/23 Python
Python使用cx_Oracle调用Oracle存储过程的方法示例
2017/10/07 Python
PyQt5每天必学之组合框
2018/04/20 Python
解决yum对python依赖版本问题
2019/07/05 Python
基于Python+QT的gui程序开发实现
2020/07/03 Python
理解Django 中Call Stack机制的小Demo
2020/09/01 Python
CSS+jQuery实现的在线答题功能
2015/04/25 HTML / CSS
印尼披萨外送专家:Domino’s Pizza印尼
2017/12/28 全球购物
在什么时候需要使用"常引用"
2015/12/31 面试题
普通院校学生的自荐信
2013/11/27 职场文书
航海技术专业毕业生求职信
2014/04/06 职场文书
银行委托书范本
2014/09/28 职场文书
地道战观后感
2015/06/04 职场文书
孔子观后感
2015/06/08 职场文书
公司酒会致辞
2015/07/30 职场文书
观看《信仰》心得体会
2016/01/15 职场文书
Nginx反向代理学习实例教程
2021/10/24 Servers