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 相关文章推荐
合并table相同单元格的jquery插件分享(很精简)
Jun 20 Javascript
javascript 二进制运算技巧解析
Nov 27 Javascript
Seajs的学习笔记
Mar 04 Javascript
js实现DOM走马灯特效的方法
Jan 21 Javascript
被遗忘的javascript的slice() 方法
Apr 20 Javascript
javascript函数特点实例分析
May 14 Javascript
JavaScript实现选择框按比例拖拉缩放的方法
Aug 04 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
Aug 17 Javascript
jQuery实现元素拖拽并cookie保存顺序的方法
Feb 20 Javascript
使用do...while的方法输入一个月中所有的周日(实例代码)
Jul 22 Javascript
JavaScript中join()、splice()、slice()和split()函数用法示例
Aug 24 Javascript
JS实现选项卡插件的两种写法(jQuery和class)
Dec 30 jQuery
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与ASP
2006/10/09 PHP
php使用pear_smtp发送邮件
2016/04/15 PHP
Yii2 输出xml格式数据的方法
2016/05/03 PHP
PHP实现非阻塞模式的方法分析
2018/07/26 PHP
权威JavaScript 中的内存泄露模式
2007/08/13 Javascript
Javascript Jquery 遍历Json的实现代码
2010/03/31 Javascript
javascript getElementsByClassName函数
2010/04/01 Javascript
javascript 拖动表格行实现代码
2011/05/05 Javascript
multiSteps 基于Jquery的多步骤滑动切换插件
2011/07/22 Javascript
js防止表单重复提交实现代码
2012/09/05 Javascript
jQuery插件的写法分享
2013/06/12 Javascript
Javascript表格翻页效果的具体实现
2013/10/05 Javascript
jQuery级联操作绑定事件实例
2014/09/02 Javascript
Javascript+CSS实现影像卷帘效果思路及代码
2014/10/20 Javascript
Javascript核心读书有感之语句
2015/02/11 Javascript
javascript中apply、call和bind的使用区别
2016/04/05 Javascript
jQuery.parseHTML() 函数详解
2017/01/09 Javascript
Angular.js中ng-include用法及多标签页面的实现方式详解
2017/05/07 Javascript
js中获取URL参数的共用方法getRequest()方法实例详解
2018/10/24 Javascript
详解JavaScript的变量
2019/04/04 Javascript
vue 在服务器端直接修改请求的接口地址
2020/12/19 Vue.js
用Javascript实现发送短信验证码间隔功能
2021/02/08 Javascript
Python MySQLdb 使用utf-8 编码插入中文数据问题
2018/03/13 Python
Python 解决中文写入Excel时抛异常的问题
2018/05/03 Python
Python实现基于PIL和tesseract的验证码识别功能示例
2018/07/11 Python
UI自动化定位常用实现方法代码示例
2020/10/27 Python
CSS3五个技巧给你的网站带来出色的效果
2009/04/02 HTML / CSS
一款简洁的纯css3代码实现的动画导航
2014/10/31 HTML / CSS
韩国江南富人区高端时尚百货商场:Galleria(格乐丽雅)
2018/03/27 全球购物
iPad和Surface Pro蓝牙键盘:Brydge
2018/11/10 全球购物
财产公证书样本
2014/04/04 职场文书
电力安全事故反思
2014/04/27 职场文书
小学班主任经验交流材料
2014/12/16 职场文书
Python 流媒体播放器的实现(基于VLC)
2021/04/28 Python
MySQL系列之七 MySQL存储引擎
2021/07/02 MySQL
Java十分钟精通进阶适配器模式
2022/04/06 Java/Android