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中暂停功能的实现代码
Mar 04 Javascript
jquery的键盘事件修改代码
Feb 24 Javascript
jquery中each方法示例和常用选择器
Jul 08 Javascript
深入理解Java线程编程中的阻塞队列容器
Dec 07 Javascript
JS 根据子网掩码,网关计算出所有IP地址范围示例
Apr 23 Javascript
基于chosen插件实现人员选择树搜索自动筛选功能
Sep 24 Javascript
微信小程序 页面之间传参实例详解
Jan 13 Javascript
vue实现动态数据绑定
Apr 28 Javascript
layui导航栏实现代码
May 19 Javascript
vue elementui form表单验证的实现
Nov 11 Javascript
vue动态合并单元格并添加小计合计功能示例
Nov 26 Vue.js
vue+flask实现视频合成功能(拖拽上传)
Mar 04 Vue.js
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
咖啡是不是喝了会上瘾?咖啡是必须品吗!
2021/03/04 新手入门
mysql+php分页类(已测)
2008/03/31 PHP
关于IIS php调用com组件的权限问题
2012/01/11 PHP
PHP中构造函数和析构函数解析
2014/10/10 PHP
PHP不使用内置函数实现字符串转整型的方法示例
2017/07/03 PHP
php文件操作之文件写入字符串、数组的方法分析
2019/04/15 PHP
PHP autoload使用方法及步骤详解
2020/09/05 PHP
javascript天然的迭代器
2010/10/29 Javascript
Javascript类定义语法,私有成员、受保护成员、静态成员等介绍
2011/12/08 Javascript
nodejs实现bigpipe异步加载页面方案
2016/01/26 NodeJs
浅析Javascript中bind()方法的使用与实现
2016/04/29 Javascript
Jquery中map函数的用法
2016/06/03 Javascript
vue中使用ueditor富文本编辑器
2018/02/08 Javascript
在Vue组件中使用 TypeScript的方法
2018/02/28 Javascript
JavaScript Window浏览器对象模型原理解析
2020/05/30 Javascript
[02:32]“虐狗”镜头慎点 2016国际邀请赛中国区预选赛现场玩家采访
2016/06/28 DOTA
python中requests模块的使用方法
2015/04/08 Python
Python编写电话薄实现增删改查功能
2016/05/07 Python
python3连接MySQL数据库实例详解
2018/05/24 Python
详解Python3中ceil()函数用法
2019/02/19 Python
利用python计算windows全盘文件md5值的脚本
2019/07/27 Python
python config文件的读写操作示例
2019/09/27 Python
关于Tensorflow分布式并行策略
2020/02/03 Python
简单了解Python write writelines区别
2020/02/27 Python
基于HTML5+Webkit实现树叶飘落动画
2017/12/28 HTML / CSS
下面代码从性能上考虑,有什么问题
2015/04/03 面试题
JAVA中运算符的分类及举例
2015/09/12 面试题
销售人员获奖感言
2014/02/05 职场文书
教师中国梦演讲稿
2014/04/23 职场文书
体育专业自荐书
2014/05/29 职场文书
工地门卫岗位职责范本
2014/07/01 职场文书
党员群众路线剖析材料
2014/10/08 职场文书
优秀党员先进材料
2014/12/18 职场文书
学生会主席任命书
2015/09/21 职场文书
2016年艾滋病宣传活动总结
2016/04/01 职场文书
Mysql实现简易版搜索引擎的示例代码
2021/08/30 MySQL