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 相关文章推荐
在图片上显示左右箭头类似翻页的代码
Mar 04 Javascript
文字不间断滚动(上下左右)实例代码
Apr 21 Javascript
select、radio表单回显功能实现避免使用jquery载入赋值
Jun 08 Javascript
判断js对象是否拥有某一个属性的js代码
Aug 16 Javascript
js实现带关闭按钮始终显示在网页最底部工具条的方法
Mar 02 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
Jun 05 Javascript
JavaScript判断表单为空及获取焦点的方法
Feb 12 Javascript
javascript工厂模式和构造函数模式创建对象方法解析
Dec 30 Javascript
js异步编程小技巧详解
Aug 14 Javascript
angular.js实现列表orderby排序的方法
Oct 02 Javascript
微信小程序如何调用json数据接口并解析
Jun 29 Javascript
用JavaScript实现贪吃蛇游戏
Oct 23 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
mysq GBKl乱码
2006/11/28 PHP
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
2011/06/02 PHP
ubuntu12.04使用c编写php扩展模块教程分享
2013/12/25 PHP
讲两件事:1.this指针的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件处理上的区别
2007/04/12 Javascript
javascript的键盘控制事件说明
2008/04/15 Javascript
Cookie 小记
2010/04/01 Javascript
定时器(setTimeout/setInterval)调用带参函数失效解决方法
2013/03/26 Javascript
javascript中RegExp保留小数点后几位数的方法分享
2013/08/13 Javascript
删除javascript中注释语句的正则表达式
2014/06/11 Javascript
jquery常用操作小结
2014/07/21 Javascript
JQuery操作元素的css样式
2015/03/09 Javascript
jquery仿百度百科底部浮动导航特效
2015/08/08 Javascript
javascript中caller和callee详解
2015/08/10 Javascript
JS实现的新浪微博大厅文字内容滚动效果代码
2015/11/05 Javascript
基于JavaScript实现回到页面顶部动画代码
2016/05/24 Javascript
关于List.ToArray()方法的效率测试
2016/09/30 Javascript
Vue-router结合transition实现app前进后退动画切换效果的实例
2017/10/11 Javascript
3种vue组件的书写形式
2017/11/29 Javascript
JS/HTML5游戏常用算法之路径搜索算法 随机迷宫算法详解【普里姆算法】
2018/12/13 Javascript
this在vue和小程序中的使用详解
2019/01/28 Javascript
[01:10]DOTA2英雄背景故事第四期之混沌法则混沌骑士
2020/07/16 DOTA
python实现在控制台输入密码不显示的方法
2015/07/02 Python
Python的Django中将文件上传至七牛云存储的代码分享
2016/06/03 Python
Django框架多表查询实例分析
2018/07/04 Python
python 调用有道api接口的方法
2019/01/03 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
2019/05/10 Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
2020/02/26 Python
英国知名衬衫品牌美国网站:Charles Tyrwhitt美国
2016/08/28 全球购物
Antler英国官网:购买安特丽行李箱、拉杆箱
2019/08/25 全球购物
PHP解析URL是哪个函数?怎么用?
2013/05/09 面试题
物流仓储计划书
2014/01/10 职场文书
教师敬业奉献模范事迹材料
2014/05/18 职场文书
个人房屋买卖协议书(范本)
2014/10/04 职场文书
幼儿园教师暑期培训心得体会
2016/01/09 职场文书
超市啤酒狂欢夜策划方案范文!
2019/07/03 职场文书
vue组件冲突之引用另一个组件出现组件不显示的问题
2022/04/13 Vue.js