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 相关文章推荐
浏览器脚本兼容 文本框中,回车键触发事件的兼容
Jun 21 Javascript
Javascript控制页面链接在新窗口打开具体方法
Aug 16 Javascript
浅析jQuery移动开发中内联按钮和分组按钮的编写
Dec 04 Javascript
jQuery事件委托之Safari
Jul 05 Javascript
使用ef6创建oracle数据库的实体模型遇到的问题及解决方案
Nov 09 Javascript
微信小程序实现获取自己所处位置的经纬度坐标功能示例
Nov 30 Javascript
node.js通过axios实现网络请求的方法
Mar 05 Javascript
angularJS1 url中携带参数的获取方法
Oct 09 Javascript
浅谈对于“不用setInterval,用setTimeout”的理解
Aug 28 Javascript
layui的select联动实现代码
Sep 28 Javascript
浅谈vue3中effect与computed的亲密关系
Oct 10 Javascript
基于Cesium绘制抛物弧线
Nov 18 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
phpadmin如何导入导出大数据文件及php.ini参数修改
2013/02/18 PHP
基于php-fpm 参数的深入理解
2013/06/03 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
2017/09/30 PHP
PHP+Mysql分布式事务与解决方案深入理解
2021/02/27 PHP
原生javascript实现图片轮播效果代码
2010/09/03 Javascript
那些年,我还在学习jquery 学习笔记
2012/03/05 Javascript
javascript实现动态模态绑定grid过程代码
2014/09/22 Javascript
AngularJS内置指令
2015/02/04 Javascript
js/jquery判断浏览器类型的方法小结
2015/05/12 Javascript
jquery实现无刷新验证码的简单实例
2016/05/19 Javascript
Webpack+Vue如何导入Jquery和Jquery的第三方插件
2017/02/20 Javascript
详解vue mixins和extends的巧妙用法
2017/12/20 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
2018/10/10 Javascript
vue-cli 目录结构详细讲解总结
2019/01/15 Javascript
使用vue完成微信公众号网页小记(推荐)
2019/04/28 Javascript
vue+element项目中过滤输入框特殊字符小结
2019/08/07 Javascript
解决vue 子组件修改父组件传来的props值报错问题
2019/11/09 Javascript
使用Node.js和Socket.IO扩展Django的实时处理功能
2015/04/20 Python
Python简单删除目录下文件以及文件夹的方法
2015/05/27 Python
Python中的条件判断语句基础学习教程
2016/02/07 Python
Python 多进程并发操作中进程池Pool的实例
2017/11/01 Python
Django异步任务之Celery的基本使用
2019/03/23 Python
Django微信小程序后台开发教程的实现
2020/06/03 Python
使用Keras加载含有自定义层或函数的模型操作
2020/06/10 Python
python爬取youtube视频的示例代码
2021/03/03 Python
英国电子专家:maplin
2019/09/04 全球购物
台湾全方位线上课程与职能学习平台:TibaMe
2019/12/04 全球购物
2014年社区民政工作总结
2014/12/02 职场文书
护士节慰问信
2015/02/15 职场文书
幼儿园校车安全责任书
2015/05/08 职场文书
素质教育学习心得体会
2016/01/19 职场文书
2019年度政务公开考核工作总结模板
2019/11/11 职场文书
导游词之无锡唐城
2019/12/12 职场文书
奇妙的 CSS shapes(CSS图形)
2021/04/05 HTML / CSS
HTML+CSS+JS实现图片的瀑布流布局的示例代码
2021/04/22 HTML / CSS
springmvc直接不经过controller访问WEB-INF中的页面问题
2022/02/24 Java/Android