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 相关文章推荐
类似CSDN图片切换效果脚本
Sep 17 Javascript
图片动画横条广告带上下滚动的JS代码
Oct 25 Javascript
百度判断手机终端并自动跳转js代码及使用实例
Jun 11 Javascript
jquery获取url参数及url加参数的方法
Oct 26 Javascript
javascript实现input file上传图片预览效果
Dec 31 Javascript
基于jQuery实现左侧菜单栏可折叠功能
Dec 27 Javascript
详解Angular2中Input和Output用法及示例
May 21 Javascript
简单的网页广告特效实例
Aug 19 Javascript
微信小程序开发之改变data中数组或对象的某一属性值
Jul 05 Javascript
在vue使用clipboard.js进行一键复制文本的实现示例
Jan 15 Javascript
Vue动态组件与异步组件实例详解
Feb 23 Javascript
Swiper.js实现移动端元素左右滑动
Sep 08 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+ajax分页实例简析
2015/12/07 PHP
Ajax和PHP正则表达式验证表单及验证码
2016/09/24 PHP
event.srcElement 用法笔记e.target
2009/12/18 Javascript
jQuery之$(document).ready()使用介绍
2012/04/05 Javascript
提示$ is not defined错误分析及解决
2013/04/09 Javascript
js克隆对象、数组的常用方法介绍
2013/09/26 Javascript
从零学JSON之JSON数据结构
2014/05/19 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
2016/09/27 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
2016/12/09 Javascript
jQuery实现 上升、下降、删除、添加一行代码
2017/03/06 Javascript
微信JS-SDK选取手机照片上传功能
2017/04/21 Javascript
jQuery滚动插件scrollable.js用法分析
2017/05/25 jQuery
vue+axios+mock.js环境搭建的方法步骤
2018/08/28 Javascript
Angular.JS读取数据库数据调用完整实例
2019/07/02 Javascript
浅析webpack-bundle-analyzer在vue-cli3中的使用
2019/10/23 Javascript
js实现消灭星星(web简易版)
2020/03/24 Javascript
Phantomjs抓取渲染JS后的网页(Python代码)
2016/05/13 Python
用Python实现将一张图片分成9宫格的示例
2019/07/05 Python
ORM Django 终端打印 SQL 语句实现解析
2019/08/09 Python
使用Python生成200个激活码的实现方法
2019/11/22 Python
python中with用法讲解
2020/02/07 Python
celery在python爬虫中定时操作实例讲解
2020/11/27 Python
CSS3系列之3D制作方法案例
2017/08/14 HTML / CSS
健康监测猫砂:Pretty Litter
2017/05/25 全球购物
环境科学专业个人求职信
2013/09/26 职场文书
经济信息系毕业生自荐信范文
2014/03/15 职场文书
房地产公司见习自我鉴定
2014/04/28 职场文书
公民代理授权委托书
2014/09/24 职场文书
小学“向国旗敬礼”网上签名寄语活动总结
2014/09/27 职场文书
学校总务处领导干部个人对照检查材料思想汇报
2014/10/06 职场文书
学术会议邀请函
2015/01/30 职场文书
文艺委员竞选稿
2015/11/19 职场文书
高中地理教学反思
2016/02/19 职场文书
Vue实现下拉加载更多
2021/05/09 Vue.js
NodeJs内存占用过高的排查实战记录
2021/05/10 NodeJs
html中相对位置与绝对位置的具体使用
2022/05/15 HTML / CSS