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中 For, While与递归的用法
May 07 Javascript
jquery实现多级下拉菜单的实例代码
Oct 02 Javascript
改变文件域的样式实现思路同时兼容ie、firefox
Oct 23 Javascript
jquery插件jquery倒计时插件分享
Dec 27 Javascript
JavaScript类型系统之布尔Boolean类型详解
Jun 26 Javascript
酷! 不同风格页面布局幻灯片特效js实现
Feb 19 Javascript
jquery pagination插件动态分页实例(Bootstrap分页)
Dec 23 Javascript
详解angularJs中自定义directive的数据交互
Jan 13 Javascript
Angular中ng-options下拉数据默认值的设定方法
Jun 21 Javascript
JQuery判断正整数整理小结
Aug 21 jQuery
JavaScript设计模式之构造函数模式实例教程
Jul 02 Javascript
node.js连接mysql与基本用法示例
Jan 05 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
Codeigniter购物车类不能添加中文的解决方法
2014/11/29 PHP
jquery+php实现导出datatables插件数据到excel的方法
2015/07/06 PHP
php执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
PHP获取指定日期是星期几的实现方法
2016/11/30 PHP
关于php unset对json_encode的影响详解
2018/11/14 PHP
用js得到网页中所有的div的id
2020/10/19 Javascript
JavaScript的Cookies
2008/01/16 Javascript
仿迅雷焦点广告效果(JQuery版)
2008/11/19 Javascript
浏览器窗口大小变化时使用resize事件对框架不起作用的解决方法
2014/05/11 Javascript
Jquery日历插件制作简单日历
2015/10/28 Javascript
jquery实现一个简单的表单验证实例
2016/03/30 Javascript
JS实现简单的右下角弹出提示窗口完整实例
2016/06/21 Javascript
jQuery仿京东商城楼梯式导航定位菜单
2016/07/25 Javascript
vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)
2018/08/24 Javascript
Three.js实现3D机房效果
2018/12/30 Javascript
Vue分页器实现原理详解
2019/06/28 Javascript
js仿淘宝放大镜效果
2020/12/28 Javascript
详解Python中DOM方法的动态性
2015/04/11 Python
Django实现表单验证
2018/09/08 Python
Python UnboundLocalError和NameError错误根源案例解析
2018/10/31 Python
运用Python的webbrowser实现定时打开特定网页
2019/02/21 Python
Python生成器的使用方法和示例代码
2019/03/04 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
2019/08/07 Python
python查看数据类型的方法
2019/10/12 Python
Python中Subprocess的不同函数解析
2019/12/10 Python
python中wx模块的具体使用方法
2020/05/15 Python
Python 利用argparse模块实现脚本命令行参数解析
2020/12/28 Python
使用Python webdriver图书馆抢座自动预约的正确方法
2021/03/04 Python
欧洲最大的婴幼儿服装及内衣公司:Petit Bateau(小帆船)
2016/08/16 全球购物
澳大利亚家具和家居用品在线:BROSA
2017/11/02 全球购物
解除劳动合同协议书范本
2014/04/14 职场文书
扶贫办主任查摆“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
留学推荐信英文范文
2015/03/26 职场文书
导游词之上饶龟峰
2019/10/25 职场文书
利用python实时刷新基金估值(摸鱼小工具)
2021/09/15 Python
详解Python如何批量采集京东商品数据流程
2022/01/22 Python