javascript 小数乘法结果错误的处理方法


Posted in Javascript onJuly 28, 2016

一、用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>
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 相关文章推荐
javaScript call 函数的用法说明
Apr 09 Javascript
JavaScript中的类继承
Nov 25 Javascript
JavaScript中instanceof运算符的用法总结
Nov 19 Javascript
js由下向上不断上升冒气泡效果实例
May 07 Javascript
[原创]Javascript 实现广告后加载 可加载百度谷歌联盟广告
May 11 Javascript
原生JS实现层叠轮播图
May 17 Javascript
Vue.js实现的计算器功能完整示例
Jul 11 Javascript
Postman的下载及安装教程详解
Oct 16 Javascript
CryptoJS中AES实现前后端通用加解密技术
Dec 18 Javascript
用node开发并发布一个cli工具的方法步骤
Jan 03 Javascript
vue cli 3.0 搭建项目的图文教程
May 17 Javascript
JS XMLHttpRequest原理与使用方法深入详解
Apr 30 Javascript
轮播的简单实现方法
Jul 28 #Javascript
关于JS变量和作用域详解
Jul 28 #Javascript
jquery轮播的实现方式 附完整实例
Jul 28 #Javascript
AngularJS入门教程中SQL实例详解
Jul 27 #Javascript
AngularJS入门教程之表格实例详解
Jul 27 #Javascript
基于jQuery实现仿微博发布框字数提示
Jul 27 #Javascript
AngularJS入门教程之Select(选择框)详解
Jul 27 #Javascript
You might like
一个好用的分页函数
2006/11/16 PHP
php数组的概述及分类与声明代码演示
2013/02/26 PHP
php cli 小技巧
2013/06/03 PHP
深入理解PHP内核(一)
2015/11/10 PHP
php 5.4 全新的代码复用Trait详解
2017/01/05 PHP
使用JavaScript switch case 另类写法
2010/03/14 Javascript
ExtJS TabPanel beforeremove beforeclose使用说明
2010/03/31 Javascript
Javascript实现动态菜单添加的实例代码
2013/07/05 Javascript
JavaScript保留两位小数的2个自定义函数
2014/05/05 Javascript
jQuery解析Json实例详解
2015/11/24 Javascript
学习JavaScript设计模式(继承)
2015/11/26 Javascript
CKEditor无法验证的解决方案(js验证+jQuery Validate验证)
2016/05/09 Javascript
jQuery实现页面下拉100像素出现悬浮窗口的方法
2016/09/05 Javascript
JavaScript中关于for循环删除数组元素内容时出现的问题
2016/11/21 Javascript
AngularJS ng-repeat指令及Ajax的应用实例分析
2017/07/06 Javascript
js 判断当前时间是否处于某个一个时间段内
2019/09/19 Javascript
JavaScript实现跟随鼠标移动的盒子
2021/01/28 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
Python写的Socks5协议代理服务器
2014/08/06 Python
python访问系统环境变量的方法
2015/04/29 Python
Python使用Matplotlib实现Logos设计代码
2017/12/25 Python
Python wxPython库使用wx.ListBox创建列表框示例
2018/09/03 Python
Python实现按逗号分隔列表的方法
2018/10/23 Python
Python二叉搜索树与双向链表转换算法示例
2019/03/02 Python
Python3内置模块之json编解码方法小结【推荐】
2020/12/09 Python
Python实现的远程文件自动打包并下载功能示例
2019/07/12 Python
python如果快速判断数字奇数偶数
2019/11/13 Python
纯CSS3实现图片无间断轮播效果
2016/08/25 HTML / CSS
公司领导推荐信
2013/11/12 职场文书
卖车协议书范本4篇
2014/10/01 职场文书
教师工作总结范文2014
2014/11/10 职场文书
车间质检员岗位职责
2015/04/08 职场文书
诚信教育主题班会
2015/08/13 职场文书
教师节作文之小学四年级
2019/09/03 职场文书
java executor包参数处理功能 
2022/02/15 Java/Android
nginx配置限速限流基于内置模块
2022/05/02 Servers