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中的事件处理
Jan 16 Javascript
JavaScript 判断用户输入的邮箱及手机格式是否正确
Dec 08 Javascript
bootstrap和jQuery.Gantt的css冲突 如何解决
May 29 Javascript
浅谈js键盘事件全面控制
Dec 01 Javascript
详解JavaScript数组过滤相同元素的5种方法
May 23 Javascript
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
Oct 26 Javascript
12条写出高质量JS代码的方法
Jan 07 Javascript
Vue实现自定义下拉菜单功能
Jul 16 Javascript
JavaScript简单实现关键字文本搜索高亮显示功能示例
Jul 25 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
Mar 29 Javascript
Swiper.js实现移动端元素左右滑动
Sep 08 Javascript
JavaScript实现4位随机验证码的生成
Jan 28 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
利用文件属性结合Session实现在线人数统计
2006/10/09 PHP
php中通过curl模拟登陆discuz论坛的实现代码
2012/02/16 PHP
使用 PHPStorm 开发 Laravel
2015/03/24 PHP
Yii使用Captcha验证码的方法
2015/12/28 PHP
JavaScript Eval 函数使用
2010/03/23 Javascript
JavaScript中关于indexOf的使用方法与问题小结
2010/08/05 Javascript
js实现拖拽效果
2015/02/12 Javascript
JavaScript实现SHA-1加密算法的方法
2015/03/11 Javascript
PHP+jQuery+Ajax+Mysql如何实现发表心情功能
2015/08/06 Javascript
基于jQuery全屏焦点图左右切换插件responsiveslides
2015/09/07 Javascript
chrome调试javascript详解
2015/10/21 Javascript
JS实现从顶部下拉显示的带动画QQ客服特效代码
2015/10/24 Javascript
jq实现左滑显示删除按钮,点击删除实现删除数据功能(推荐)
2016/08/23 Javascript
JS实现课堂随机点名和顺序点名
2017/03/09 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图和饼图的组合图效果示例【附demo源码下载】
2017/03/09 Javascript
使用vue-cli(vue脚手架)快速搭建项目的方法
2018/05/21 Javascript
PM2自动部署代码步骤流程总结
2018/12/10 Javascript
微信小程序时间轴实现方法示例
2019/01/14 Javascript
VSCode使用之Vue工程配置eslint
2019/04/30 Javascript
微信小程序代码上传、审核发布小程序
2019/05/18 Javascript
JavaScript如何操作css
2020/10/24 Javascript
python读写ini配置文件方法实例分析
2015/06/30 Python
Tensorflow 合并通道及加载子模型的方法
2018/07/26 Python
使用Python制作一个打字训练小工具
2019/10/01 Python
Pytorch实现各种2d卷积示例
2019/12/30 Python
python+selenium爬取微博热搜存入Mysql的实现方法
2021/01/27 Python
高中自我鉴定范文
2013/11/03 职场文书
农民工创业典型事迹
2014/01/25 职场文书
售前工程师职业生涯规划
2014/03/02 职场文书
广告艺术设计专业自荐书
2014/07/08 职场文书
政风行风评议整改方案
2014/09/15 职场文书
乡镇领导班子四风对照检查材料
2014/09/27 职场文书
大学生村官驻村工作心得体会
2016/01/23 职场文书
2019年年中职场激励人心语录30条
2019/08/07 职场文书
Jupyter Notebook 如何修改字体和大小以及更改字体样式
2021/06/03 Python
深入理解java.lang.String类的不可变性
2021/06/27 Java/Android