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在一段文字中的光标处插入其他文字
Aug 26 Javascript
jquery仿QQ商城带左右按钮控制焦点图片切换滚动效果
Jun 27 Javascript
微信小程序实现带刻度尺滑块功能
Mar 29 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
Aug 03 Javascript
webpack 样式加载的实现原理
Jun 12 Javascript
React注册倒计时功能的实现
Sep 06 Javascript
小程序云函数调用API接口的方法
May 17 Javascript
JS前端知识点offset,scroll,client,冒泡,事件对象的应用整理总结
Jun 27 Javascript
详解使用mocha对webpack打包的项目进行&quot;冒烟测试&quot;的大致流程
Apr 27 Javascript
vue中使用vue-pdf的方法详解
Sep 05 Javascript
jQuery插件实现图片轮播效果
Oct 19 jQuery
JavaScript 异步时序问题
Nov 20 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/07/22 PHP
PHP 年龄计算函数(精确到天)
2012/06/07 PHP
php和asp语法上的区别总结
2019/05/12 PHP
JQuery 学习笔记 选择器之六
2009/07/23 Javascript
COM中获取JavaScript数组大小的代码
2009/11/22 Javascript
利用location.hash实现跨域iframe自适应
2010/05/04 Javascript
基于jquery的使ListNav兼容中文首字拼音排序的实现代码
2011/07/10 Javascript
jquery自动切换tabs选项卡的具体实现
2013/12/24 Javascript
JavaScript实现相册弹窗功能(zepto.js)
2016/06/21 Javascript
jQuery 翻页组件yunm.pager.js实现div局部刷新的思路
2016/08/11 Javascript
Jquery UI实现一次拖拽多个选中的元素操作
2020/12/01 Javascript
解析Vue2.0双向绑定实现原理
2017/02/23 Javascript
jquery仿苹果的时间/日期选择效果
2017/03/08 Javascript
Angular.JS中的this指向详解
2017/05/17 Javascript
vuex的简单使用教程
2018/02/02 Javascript
Vue封装Swiper实现图片轮播效果
2018/02/06 Javascript
Vue项目分环境打包的实现步骤
2018/04/02 Javascript
微信小程序chooseImage的用法(从本地相册选择图片或使用相机拍照)
2018/08/22 Javascript
微信小程序自定义tabBar组件开发详解
2020/09/24 Javascript
jQuery-ui插件sortable实现自由拖动排序
2018/12/01 jQuery
webpack打包优化的几个方法总结
2020/02/10 Javascript
小程序瀑布流组件实现翻页与图片懒加载
2020/05/19 Javascript
小程序实现背景音乐播放和暂停
2020/06/19 Javascript
解决vue-loader加载不上的问题
2020/10/21 Javascript
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
Python实现自动上京东抢手机
2018/02/06 Python
Python中使用threading.Event协调线程的运行详解
2020/05/02 Python
Python容器类型公共方法总结
2020/08/19 Python
用python写一个带有gui界面的密码生成器
2020/11/06 Python
Volcom法国官网:美国冲浪滑板品牌
2017/05/25 全球购物
电气工程及自动化专业自荐书范文
2013/12/18 职场文书
中学生国旗下讲话稿
2014/04/26 职场文书
2014年培训工作总结范文
2014/11/27 职场文书
小学生作文评语集锦
2014/12/25 职场文书
介绍长城的导游词
2015/01/30 职场文书
讲座通知范文
2015/04/23 职场文书