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 相关文章推荐
js函数setTimeout延迟执行的简单介绍
Jul 17 Javascript
jQuery获取iframe的document对象的方法
Oct 10 Javascript
JavaScript中的getTime()方法使用详解
Jun 10 Javascript
关于JS中的apply,call,bind的深入解析
Apr 05 Javascript
一种Javascript解释ajax返回的json的好方法(推荐)
Jun 02 Javascript
jq给页面添加覆盖层遮罩的实例
Feb 16 Javascript
jQuery插件开发发送短信倒计时功能代码
May 09 jQuery
JS遍历DOM文档树的方法实例详解
Apr 03 Javascript
vue-router history模式下的微信分享小结
Jul 05 Javascript
使用vscode快速建立vue模板过程详解
Oct 10 Javascript
VSCode 配置uni-app的方法
Jul 11 Javascript
基于vue与element实现创建试卷相关功能(实例代码)
Dec 07 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
关于IIS php调用com组件的权限问题
2012/01/11 PHP
php中动态变量用法实例
2015/06/10 PHP
php封装好的人民币数值转中文大写类
2015/12/20 PHP
thinkPHP框架中执行原生SQL语句的方法
2017/10/25 PHP
PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】
2019/05/06 PHP
js window.onload 加载多个函数和追加函数详解
2014/01/08 Javascript
JS和JQ的event对象区别分析
2014/11/24 Javascript
jquery+CSS实现的多级竖向展开树形TRee菜单效果
2015/08/24 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
2015/08/25 Javascript
js面向对象的写法
2016/02/19 Javascript
JS获取复选框的值,并传递到后台的实现方法
2016/05/30 Javascript
关于网页中的无缝滚动的js代码
2016/06/09 Javascript
js实现复选框的全选和取消全选效果
2017/01/03 Javascript
js每隔两秒输出数组中的一项(实例)
2017/05/28 Javascript
用JS实现简单的登录验证功能
2017/07/28 Javascript
echarts饼图扇区添加点击事件的实例
2017/10/16 Javascript
JavaScript实现微信红包算法及问题解决方法
2018/04/26 Javascript
JavaScript中的事件与异常捕获详析
2019/02/24 Javascript
javascript实现导航栏分页效果
2019/06/27 Javascript
vue prop传值类型检验方式
2020/07/30 Javascript
python线程、进程和协程详解
2016/07/19 Python
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
Python实现删除文件中含“指定内容”的行示例
2017/06/09 Python
python如何发布自已pip项目的方法步骤
2018/10/09 Python
python实现将多个文件分配到多个文件夹的方法
2019/01/07 Python
用Python写一个自动木马程序
2019/09/17 Python
解决pyecharts运行后产生的html文件用浏览器打开空白
2020/03/11 Python
详解django使用include无法跳转的解决方法
2020/03/19 Python
CSS3 @media的基本用法总结
2019/09/10 HTML / CSS
Giglio美国站:意大利奢侈品购物网
2018/02/10 全球购物
国际经济与贸易专业求职信
2014/07/10 职场文书
2015年社区创卫工作总结
2015/04/21 职场文书
民间借贷借条范本
2015/05/25 职场文书
离婚律师函范本
2015/05/27 职场文书
演讲开头怎么书写?
2019/08/06 职场文书
python实现求纯色彩图像的边框
2021/04/08 Python