javascript(js)的小数点乘法除法问题详解


Posted in Javascript onMarch 07, 2014

一、用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 defer>
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 相关文章推荐
ajax无刷新动态调用股票信息(改良版)
Nov 01 Javascript
Javascript call和apply区别及使用方法
Nov 14 Javascript
利用jQuary实现文字浮动提示效果示例代码
Dec 26 Javascript
js实现点击图片改变页面背景图的方法
Feb 28 Javascript
JS提交form表单实例分析
Dec 10 Javascript
jQuery实现放大镜效果实例代码
Mar 17 Javascript
Vue.js第四天学习笔记
Dec 02 Javascript
用jquery的attr方法实现图片切换效果
Feb 05 Javascript
解决ztree搜索中多级菜单展示不全问题
Jul 05 Javascript
Angularjs实现控制器之间通信方式实例总结
Mar 27 Javascript
Echarts实现多条折线可拖拽效果
Dec 19 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
Feb 16 Javascript
jquery中常用的函数和属性详细解析
Mar 07 #Javascript
jquery 操作两个select实现值之间的互相传递
Mar 07 #Javascript
JS判断文本框内容改变事件的简单实例
Mar 07 #Javascript
使用js判断TextBox控件值改变然后出发事件
Mar 07 #Javascript
jquery1.10给新增元素绑定事件的方法
Mar 06 #Javascript
jquery单行文字向上滚动效果示例
Mar 06 #Javascript
Javscript删除数组中指定元素并返回新数组
Mar 06 #Javascript
You might like
如何删除多级目录
2006/10/09 PHP
常用的javascript function代码
2008/05/23 Javascript
网页加载时页面显示进度条加载完成之后显示网页内容
2012/12/23 Javascript
基于SVG的web页面图形绘制API介绍及编程演示
2013/06/28 Javascript
js添加table的行和列 具体实现方法
2013/07/22 Javascript
javascript:void(0)的作用示例介绍
2013/10/28 Javascript
window.location 对象所包含的属性
2014/10/10 Javascript
Javascript Memoizer浅析
2014/10/16 Javascript
jQuery progressbar通过Ajax请求实现后台进度实时功能
2016/10/11 Javascript
angular ngClick阻止冒泡使用默认行为的方法
2016/11/03 Javascript
原生javascript实现的ajax异步封装功能示例
2016/11/03 Javascript
js 中获取制定的cook信息实现方法
2016/11/19 Javascript
Angularjs实现数组随机排序的方法
2018/10/02 Javascript
jQuery实现简单轮播图效果
2020/12/27 jQuery
[41:54]2018DOTA2亚洲邀请赛 4.1 小组赛A组加赛 TNC vs Liquid
2018/04/03 DOTA
pyqt4教程之messagebox使用示例分享
2014/03/07 Python
python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
2014/07/09 Python
python发送邮件实例分享
2017/07/28 Python
python实现自动发送邮件
2018/06/20 Python
Python Django 命名空间模式的实现
2019/08/09 Python
pytorch 改变tensor尺寸的实现
2020/01/03 Python
tensorflow转换ckpt为savermodel模型的实现
2020/05/25 Python
基于Python的身份证验证识别和数据处理详解
2020/11/14 Python
python中pivot()函数基础知识点
2021/01/03 Python
HTML5实现QQ聊天气泡效果
2017/06/26 HTML / CSS
红色康乃馨酒店:Red Carnation Hotels
2017/06/22 全球购物
计算机专业毕业生自荐信
2013/12/31 职场文书
统计系教授推荐信
2014/02/28 职场文书
大班亲子运动会方案
2014/06/10 职场文书
教师党员整改措施
2014/10/24 职场文书
先进个人推荐材料
2014/12/29 职场文书
大学生党员个人总结
2015/02/13 职场文书
2015年基层党建工作总结
2015/05/14 职场文书
Mysql数据库值的添加、修改、删除及清空操作实例
2021/06/20 MySQL
Go语言 详解net的tcp服务
2022/04/14 Golang
Elasticsearch6.2服务器升配后的bug(避坑指南)
2022/09/23 Servers