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编程起步(第五课)
Feb 27 Javascript
jQuery1.4.2与老版本json格式兼容的解决方法
Feb 12 Javascript
JQuery循环滚动图片代码
Dec 08 Javascript
逻辑表达式中与或非的用法详解
Jun 06 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
Feb 10 Javascript
bootstrap中添加额外的图标实例代码
Feb 15 Javascript
knockoutjs模板实现树形结构列表
Jul 31 Javascript
详解react使用react-bootstrap当轮子造车
Aug 15 Javascript
Element-ui中元素滚动时el-option超出元素区域的问题
May 30 Javascript
JS实现的简单tab切换功能完整示例
Jun 20 Javascript
vue项目部署到nginx/tomcat服务器的实现
Aug 26 Javascript
VUE中V-IF条件判断改变元素的样式操作
Aug 09 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/10/09 PHP
PHP程序员最常犯的11个MySQL错误小结
2010/11/20 PHP
修改php.ini以达到屏蔽错误信息并记录日志
2013/06/16 PHP
Linux系统递归生成目录中文件的md5的方法
2015/06/29 PHP
php 策略模式原理与应用深入理解
2019/09/25 PHP
在laravel中使用with实现动态添加where条件
2019/10/10 PHP
javascript 动态调整图片尺寸实现代码
2009/12/28 Javascript
一些有用的JavaScript和jQuery的片段分享
2011/08/23 Javascript
jQuery滚动加载图片效果的实现
2013/03/06 Javascript
jQuery中读取json文件示例代码
2013/05/10 Javascript
各浏览器对document.getElementById等方法的实现差异解析
2013/12/05 Javascript
深入探密Javascript数组方法
2015/01/08 Javascript
jQuery实现当前页面标签高亮显示的方法
2015/03/10 Javascript
Javascript调用函数方法的几种方式介绍
2015/03/20 Javascript
解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
2015/12/10 Javascript
javascript求日期差的方法
2016/03/02 Javascript
jQuery Ajax页面局部加载方法汇总
2016/06/02 Javascript
javascript数字验证的实例代码(推荐)
2016/08/20 Javascript
JavaScript制作简易计算器(不用eval)
2017/02/05 Javascript
vue2.0学习之axios的封装与vuex介绍
2018/05/28 Javascript
three.js利用gpu选取物体并计算交点位置的方法示例
2019/11/25 Javascript
浅谈VUE中演示v-for为什么要加key
2020/01/16 Javascript
Python 'takes exactly 1 argument (2 given)' Python error
2016/12/13 Python
Django压缩静态文件的实现方法详析
2018/08/26 Python
Python中的 enum 模块源码详析
2019/01/09 Python
十行代码使用Python写一个USB病毒
2019/06/21 Python
HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)
2014/04/10 HTML / CSS
Pretty You London官网:英国拖鞋和睡衣品牌
2019/05/08 全球购物
ECCO俄罗斯官网:北欧丹麦鞋履及皮具品牌
2020/06/26 全球购物
违反单位工作制度检讨书
2014/10/25 职场文书
2014年民警工作总结
2014/11/25 职场文书
运动会开幕式致辞
2015/07/29 职场文书
2016元旦主持人开场白
2015/12/03 职场文书
历史名人教你十五个读书方法,赶快Get起来!
2019/07/18 职场文书
2019幼儿园感恩节活动策划书
2019/11/28 职场文书
Tomcat执行startup.bat出现闪退的原因及解决办法
2022/04/20 Servers