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 相关文章推荐
让任务管理器中的CPU跳舞的js代码
Nov 01 Javascript
jQuery jqgrid 对含特殊字符json 数据的 Java 处理方法
Jan 01 Javascript
jquery attr 设定src中含有&amp;(宏)符号问题的解决方法
Jul 26 Javascript
jQuery手机拨号界面特效代码分享
Aug 27 Javascript
js实现向右横向滑出的二级菜单效果
Aug 27 Javascript
JS实现仿Windows7风格的网页右键菜单效果代码
Sep 11 Javascript
BootStrap实现树形目录组件代码详解
Jun 21 Javascript
AngularJS之ionic 框架下实现 Localstorage本地存储
Apr 22 Javascript
JavaScript设置名字输入不合法的实现方法
May 23 Javascript
通过webpack引入第三方库的方法
Jul 20 Javascript
新年快乐! javascript实现超级炫酷的3D烟花特效
Jan 30 Javascript
html-webpack-plugin修改页面的title的方法
Jun 18 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
PHP 中文处理技巧
2010/04/25 PHP
Yii2中简单的场景使用介绍
2017/06/02 PHP
PHP Laravel中的Trait使用方法
2019/01/20 PHP
PHP5.6读写excel表格文件操作示例
2019/02/26 PHP
PHP基础之输出缓冲区基本概念、原理分析
2019/06/19 PHP
模拟jQuery ajax服务器端与客户端通信的代码
2011/03/28 Javascript
让复选框只能选择一项的方法
2013/10/08 Javascript
Jquery取得iframe下内容的方法
2013/11/18 Javascript
javascript获取元素偏移量的方法有哪些
2014/06/24 Javascript
JS获取客户端IP地址、MAC和主机名的7个方法汇总
2014/07/21 Javascript
JS实现关键字搜索时的相关下拉字段效果
2014/08/05 Javascript
详解JavaScript正则表达式之RegExp对象
2015/12/13 Javascript
javascript中异常处理案例(推荐)
2016/10/03 Javascript
基于Vue.js实现简单搜索框
2020/03/26 Javascript
vue bus全局事件中心简单Demo详解
2018/02/26 Javascript
VueJS 组件参数名命名与组件属性转化问题
2018/12/03 Javascript
通过js随机函数Math.random实现乱序
2020/05/19 Javascript
vue中使用vue-pdf的方法详解
2020/09/05 Javascript
Python 调用VC++的动态链接库(DLL)
2008/09/06 Python
总结python爬虫抓站的实用技巧
2016/08/09 Python
python中redis的安装和使用
2016/12/04 Python
利用python微信库itchat实现微信自动回复功能
2017/05/18 Python
对Python 数组的切片操作详解
2018/07/02 Python
Python GUI编程 文本弹窗的实例
2019/06/11 Python
Python autoescape标签用法解析
2020/01/17 Python
css3 仿写阿里云水纹效果的示例代码
2018/02/10 HTML / CSS
英国定做窗帘和纺织品面料一站式商店:Dekoria
2018/08/29 全球购物
蛋糕店的商业计划书范文
2014/01/27 职场文书
小学生保护环境倡议书
2014/05/15 职场文书
商业企业管理专业求职信
2014/07/10 职场文书
甜品蛋糕店创业计划书
2014/09/21 职场文书
党风廉政建设调研报告
2015/01/01 职场文书
机关干部作风整顿心得体会
2016/01/22 职场文书
python3读取文件指定行的三种方法
2021/05/24 Python
PyMongo 查询数据的实现
2021/06/28 Python
使用CSS实现黑白格背景效果
2022/06/01 HTML / CSS