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 相关文章推荐
cnblogs 代码高亮显示后的代码复制问题解决实现代码
Dec 14 Javascript
JavaScript常用全局属性与方法记录积累
Jul 03 Javascript
js控制frameSet示例
Sep 10 Javascript
JS获取文本框,下拉框,单选框的值的简单实例
Feb 26 Javascript
删除javascript中注释语句的正则表达式
Jun 11 Javascript
JS 打印功能代码可实现打印预览、打印设置等
Oct 31 Javascript
JQuery CheckBox(复选框)操作方法汇总
Apr 15 Javascript
js实现从右向左缓缓浮出网页浮动层广告的方法
May 09 Javascript
基于JavaScript如何实现ajax调用后台定义的方法
Dec 29 Javascript
深入理解JavaScript内置函数
Jun 03 Javascript
Vue的Flux框架之Vuex状态管理器
Jul 30 Javascript
JavaScript this使用方法图解
Feb 04 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
利用static实现表格的颜色隔行显示
2006/10/09 PHP
通过table标签,PHP输出EXCEL的实现方法
2013/07/24 PHP
PHP中HTML标签过滤技巧
2014/01/07 PHP
PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例
2014/07/15 PHP
浅析PHP编程中10个最常见的错误
2014/08/08 PHP
Symfony2联合查询实现方法
2016/03/18 PHP
ThinkPHP5.0框架控制器继承基类和自定义类示例
2018/05/25 PHP
纯JS实现动态时间显示代码
2014/02/08 Javascript
jQuery中ajax的load()方法用法实例
2014/12/26 Javascript
JavaScript操作DOM元素的childNodes和children区别
2015/04/01 Javascript
使用jquery提交form表单并自定义action的方法
2016/05/25 Javascript
easyui-datagrid特殊字符不能显示的处理方法
2017/04/12 Javascript
基于js 各种排序方法和sort方法的区别(详解)
2018/01/03 Javascript
React之PureComponent的使用作用
2018/07/10 Javascript
使用Vue实现图片上传的三种方式
2018/07/17 Javascript
js实现提交前对列表数据的增删改查
2020/01/16 Javascript
vue过滤器实现日期格式化的案例分析
2020/07/02 Javascript
在vue中使用Echarts利用watch做动态数据渲染操作
2020/07/20 Javascript
vue 项目引入echarts 添加点击事件操作
2020/09/09 Javascript
深入理解 Python 中的多线程 新手必看
2016/11/20 Python
python实现发送邮件功能
2017/07/22 Python
python正则表达式re之compile函数解析
2017/10/25 Python
python 统计列表中不同元素的数量方法
2018/06/29 Python
基于python中theano库的线性回归
2018/08/31 Python
PyCharm 专业版安装图文教程
2020/02/20 Python
PyInstaller的安装和使用的详细步骤
2020/06/02 Python
python邮件中附加文字、html、图片、附件实现方法
2021/01/04 Python
Python爬虫定时计划任务的几种常见方法(推荐)
2021/01/15 Python
高性能装备提升营地:Kammok
2019/02/27 全球购物
戴森香港官方网站:Dyson香港
2021/02/11 全球购物
Why we need EJB
2016/10/20 面试题
电子银行业务授权委托书
2014/10/10 职场文书
个人作风建设剖析材料
2014/10/11 职场文书
扬州个园导游词
2015/02/06 职场文书
python随机打印成绩排名表
2021/06/23 Python
MySQL数据库简介与基本操作
2022/05/30 MySQL