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.The.Good.Parts阅读笔记(一)假值与===运算符
Nov 16 Javascript
Jquery插件 easyUI属性汇总
Jan 19 Javascript
通过js简单实现将一个文本内容转译成加密文本
Oct 22 Javascript
javascript Event对象详解及使用示例
Nov 22 Javascript
AngularJS表单编辑提交功能实例
Feb 13 Javascript
网页中JS函数自动执行常用三种方法
Mar 30 Javascript
Bootstrap 网站实例之单页营销网站
Oct 20 Javascript
Angular.js自动化测试之protractor详解
Jul 07 Javascript
bootstrap是什么_动力节点Java学院整理
Jul 14 Javascript
addeventlistener监听scroll跟touch(实例讲解)
Aug 04 Javascript
浅谈React 服务器端渲染的使用
May 08 Javascript
微信小程序实现左侧滑动导航栏
Apr 08 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生成随机数的方法实例分析
2015/01/22 PHP
PHP使用GD库输出汉字的方法【测试可用】
2016/11/10 PHP
Jquery跨域获得Json时invalid label错误的解决办法
2011/01/11 Javascript
Javascript中的call()方法介绍
2015/03/15 Javascript
JS实现CheckBox复选框全选全不选功能
2015/05/06 Javascript
值得分享的Bootstrap Ace模板实现菜单和Tab页效果
2015/12/30 Javascript
如何解决手机浏览器页面点击不跳转浏览器双击放大网页
2016/07/01 Javascript
基于JavaScript实现轮播图代码
2016/07/14 Javascript
js实现的页面加载完毕之前loading提示效果完整示例【附demo源码下载】
2016/08/02 Javascript
基于Phantomjs生成PDF的实现方法
2016/11/07 Javascript
JS实现的随机排序功能算法示例
2017/06/09 Javascript
Vue封装的组件全局注册并引用
2019/07/24 Javascript
使用apifm-wxapi模块中的问题及解决方法
2019/08/05 Javascript
Vue 自定义指令功能完整实例
2019/09/17 Javascript
js实现整体缩放页面适配移动端
2020/03/31 Javascript
[45:46]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS DT
2014/05/23 DOTA
python with提前退出遇到的坑与解决方案
2018/01/05 Python
Python3 实现随机生成一组不重复数并按行写入文件
2018/04/09 Python
Python中list查询及所需时间计算操作示例
2018/06/21 Python
Django中日期处理注意事项与自定义时间格式转换详解
2018/08/06 Python
pycharm运行scrapy过程图解
2019/11/22 Python
python3中numpy函数tile的用法详解
2019/12/04 Python
Python中Selenium库使用教程详解
2020/07/23 Python
Python timeit模块原理及使用方法
2020/10/10 Python
用python进行视频剪辑
2020/11/02 Python
美国特价机票专家:Airfarewatchdog
2018/01/24 全球购物
机械工程师的岗位职责
2013/11/17 职场文书
学年自我鉴定
2014/01/16 职场文书
促销活动总结怎么写
2014/06/25 职场文书
新课培训心得体会
2014/09/03 职场文书
2015年行政助理工作总结
2015/04/30 职场文书
爱国主义主题班会
2015/08/14 职场文书
如何利用python和DOS获取wifi密码
2021/03/31 Python
使用Pytorch实现two-head(多输出)模型的操作
2021/05/28 Python
Win11怎么启动任务管理器?Win11启动任务管理器的几种方法
2021/11/23 数码科技
Python docx库删除复制paragraph及行高设置图片插入示例
2022/07/23 Python