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 变量作用域分析
Jul 04 Javascript
jquery的选择器的使用技巧之如何选择input框
Sep 22 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
Jan 08 Javascript
原生Ajax 和jQuery Ajax的区别示例分析
Dec 17 Javascript
基于javascript实现窗口抖动效果
Jan 03 Javascript
JS HTML5实现拖拽移动列表效果
Aug 27 Javascript
jQuery实现ajax的叠加和停止(终止ajax请求)
Aug 08 Javascript
使用bootstrap-paginator.js 分页来进行ajax 异步分页请求示例
Mar 09 Javascript
jQuery Form插件使用详解_动力节点Java学院整理
Jul 17 jQuery
es7学习教程之fetch解决异步嵌套问题的方法示例
Jul 21 Javascript
Three.js入门之hello world以及如何绘制线
Sep 25 Javascript
微信小程序仿通讯录功能
Apr 09 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生成自己的LOG文件
2006/10/09 PHP
php下的权限算法的实现
2007/04/28 PHP
typecho插件编写教程(一):Hello World
2015/05/28 PHP
laravel配置Redis多个库的实现方法
2019/04/10 PHP
js获取某元素的class里面的css属性值代码
2014/01/16 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
2015/04/15 Javascript
最简单的JavaScript验证整数、小数、实数、有效位小数正则表达式
2015/04/17 Javascript
javascript解决IE6下hover问题的方法
2015/07/28 Javascript
基于replaceChild制作简单的吞噬特效
2015/09/21 Javascript
jQuery使用contains过滤器实现精确匹配方法详解
2016/02/25 Javascript
JS判断字符串字节数并截取长度的方法
2016/03/05 Javascript
js实现的简单图片浮动效果完整实例
2016/05/10 Javascript
论Bootstrap3和Foundation5网格系统的异同
2016/05/16 Javascript
Vuex2.0+Vue2.0构建备忘录应用实践
2016/11/30 Javascript
微信小程序new Date()方法失效问题解决方法
2019/07/29 Javascript
layui监听select变化,以及设置radio选中的方法
2019/09/24 Javascript
JS正则表达式验证端口范围(0-65535)
2020/01/06 Javascript
vue路由切换时取消之前的所有请求操作
2020/09/01 Javascript
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
2020/09/08 Javascript
Python实现简单网页图片抓取完整代码实例
2017/12/15 Python
pandas每次多Sheet写入文件的方法
2018/12/10 Python
Python3.6实现带有简单界面的有道翻译小程序
2019/04/16 Python
4行Python代码生成图像验证码(2种)
2020/04/07 Python
Python读取二进制文件代码方法解析
2020/06/22 Python
WiFi云数码相框:Nixplay
2018/07/05 全球购物
C#怎么让一个窗口居中显示?
2015/10/20 面试题
中学生演讲稿
2014/04/26 职场文书
个人课题方案
2014/05/08 职场文书
社团活动总结书
2014/06/27 职场文书
领导班子群众路线与四风问题对照检查材料思想汇报
2014/10/11 职场文书
商务考察邀请函模板
2015/02/02 职场文书
任命书标准格式
2015/03/02 职场文书
小升初自荐信怎么写
2015/03/26 职场文书
企业管理不到位检讨书
2019/06/27 职场文书
导游词之苏州阳澄湖
2019/11/15 职场文书
Redis主从配置和底层实现原理解析(实战记录)
2021/06/30 Redis