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 相关文章推荐
在ASP.NET中使用JavaScript脚本的方法
Nov 12 Javascript
基于jquery实现的文字淡入淡出效果
Nov 14 Javascript
点击弹出层效果&amp;弹出窗口后网页背景变暗效果的实现代码
Feb 10 Javascript
jquery实现瀑布流效果分享
Mar 26 Javascript
jQuery实现跟随鼠标运动图层效果的方法
Feb 02 Javascript
IScroll5 中文API参数说明和调用方法
May 21 Javascript
BootStrap 导航条实例代码
May 18 Javascript
自定义事件解决重复请求BUG的问题
Jul 11 Javascript
JavaScript this绑定过程深入详解
Dec 07 Javascript
Cordova(ionic)项目实现双击返回键退出应用
Sep 17 Javascript
vue路由传参三种基本方式详解
Dec 09 Javascript
Vue 嵌套路由使用总结(推荐)
Jan 13 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设计模式 Builder(建造者模式)
2011/06/26 PHP
Yii框架form表单用法实例
2014/12/04 PHP
PHP后台实现微信小程序登录
2018/08/03 PHP
tp5.1 框架join方法用法实例分析
2020/05/26 PHP
javascript对象之内置对象Math使用方法
2010/04/16 Javascript
css3元素简单的闪烁效果实现(html5 jquery)
2013/12/28 Javascript
jquery 图片缩放拖动的简单实例
2014/01/08 Javascript
js与运算符和或运算符的妙用
2014/02/14 Javascript
node.js中的fs.symlinkSync方法使用说明
2014/12/15 Javascript
JavaScript跨平台的开源框架NativeScript
2015/03/24 Javascript
JavaScript 常见安全漏洞和自动化检测技术
2015/08/21 Javascript
实例解析jQuery插件EasyUI最常用的表单验证规则
2015/11/29 Javascript
JS把内容动态插入到DIV的实现方法
2016/07/19 Javascript
js实现自定义路由
2017/02/04 Javascript
Intellij IDEA搭建vue-cli项目的方法步骤
2018/10/20 Javascript
Vue组件通信中非父子组件传值知识点总结
2019/12/05 Javascript
vue 微信分享回调iOS和安卓回调出现错误的解决
2020/09/07 Javascript
如何在vue中使用kindeditor富文本编辑器
2020/12/19 Vue.js
[00:31]DOTA2上海特级锦标赛 Fnatic战队宣传片
2016/03/04 DOTA
python中日期和时间格式化输出的方法小结
2015/03/19 Python
Python 比较两个数组的元素的异同方法
2017/08/17 Python
python机器学习之神经网络(三)
2017/12/20 Python
python得到windows自启动列表的方法
2018/10/14 Python
python中doctest库实例用法
2020/12/31 Python
基于Html5实现的语音搜索功能
2019/05/13 HTML / CSS
服装创业计划书范文
2014/02/05 职场文书
党的群众路线教育学习材料
2014/05/12 职场文书
2014流动人口计划生育工作总结
2014/12/20 职场文书
优秀团队申报材料
2014/12/26 职场文书
2015年党员公开承诺事项
2015/04/27 职场文书
离婚上诉状范文
2015/05/23 职场文书
公司费用报销管理制度
2015/08/04 职场文书
导游词之安徽醉翁亭
2020/01/10 职场文书
nginx限制并发连接请求数的方法
2021/04/01 Servers
js之ajax文件上传
2021/05/13 Javascript
SQL实现LeetCode(175.联合两表)
2021/08/04 MySQL