浅析js中的浮点型运算问题


Posted in Javascript onJanuary 06, 2014

js中浮点型是如何运算的呢?

例如:var a=0.69;

我想得到6.9 直接这样写 var c=a*10;

alert(c);   得到结果是:6.8999999999999995

到网上一搜,有网友说这是一个JS浮点数运算Bug,找了解决方法:

方法一:有js自定义函数

<script>
//加法函数,用来得到精确的加法结果 
//说明: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的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。 
//调用:accAdd(arg1,arg2) 
//返回值:arg1加上arg2的精确结果 
function accSub(arg1,arg2){
    var r1,r2,m,n;
    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));
    //last modify by deeka
    //动态控制精度长度
    n=(r1>=r2)?r1:r2;
    return ((arg1*m-arg2*m)/m).toFixed(n);
}
//除法函数,用来得到精确的除法结果 
//说明: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); 
} 
var a=0.69;
var b=10;
alert(a*b);//6.8999999999999995
alert((a*100)/10);
</script>

直接调用函数就可以。

方法二:如果在知道小数位个数的前提下,可以考虑通过将浮点数放大倍数到整型(最后再除以相应倍数),再进行运算操作,这样就能得到正确的结果了

alert(11*22.9);//得到251.89999999999998
alert(11*(22.9*10)/10);//得到251.9

Javascript 相关文章推荐
文本框中,回车键触发事件的js代码[多浏览器兼容]
Jun 07 Javascript
javascript四舍五入函数代码分享(保留后几位)
Dec 10 Javascript
浏览器窗口加载和大小改变事件示例
Feb 27 Javascript
信息页文内画中画广告js实现代码(文中加载广告方式)
Jan 03 Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
Mar 30 Javascript
web.js.字符串与正则表达式操作
May 13 Javascript
从源码看angular/material2 中 dialog模块的实现方法
Oct 18 Javascript
vue-router配合ElementUI实现导航的实例
Feb 11 Javascript
jQuery实现参数自定义的文字跑马灯效果
Aug 15 jQuery
vue获取元素宽、高、距离左边距离,右,上距离等还有XY坐标轴的方法
Sep 05 Javascript
layer.js之回调销毁对话框的例子
Sep 11 Javascript
antd的select下拉框因为数据量太大造成卡顿的解决方式
Oct 31 Javascript
js中浮点型运算BUG的解决方法说明
Jan 06 #Javascript
Jquery操作radio的简单实例
Jan 06 #Javascript
jQuery选择器全面总结
Jan 06 #Javascript
JavaScript定义类的几种方式总结
Jan 06 #Javascript
javascript函数定义的几种区别小结
Jan 06 #Javascript
javascript 用函数语句和表达式定义函数的区别详解
Jan 06 #Javascript
js形成页面的一种遮罩效果实例代码
Jan 04 #Javascript
You might like
mysq GBKl乱码
2006/11/28 PHP
PDO的安全处理与事物处理方法
2016/10/31 PHP
Array的push与unshift方法性能比较分析
2011/03/05 Javascript
js nextSibling属性和previousSibling属性概述及使用注意
2013/02/16 Javascript
用函数模板,写一个简单高效的 JSON 查询器的方法介绍
2013/04/17 Javascript
关于页面嵌入swf覆盖div层的问题的解决方法
2014/02/11 Javascript
全面兼容的javascript时间格式化函数(比较实用)
2014/05/14 Javascript
使用jQuery监听DOM元素大小变化
2016/02/24 Javascript
jquery+ajax实现直接提交表单实例分析
2016/06/17 Javascript
ES6入门教程之Iterator与for...of循环详解
2017/05/17 Javascript
基于js 各种排序方法和sort方法的区别(详解)
2018/01/03 Javascript
浅谈node模块与npm包管理工具
2018/01/03 Javascript
jQuery事件多次绑定与解绑问题实例分析
2019/02/19 jQuery
vue 框架下自定义滚动条(easyscroll)实现方法
2019/08/29 Javascript
vue自动化路由的实现代码
2019/09/30 Javascript
vue3实现v-model原理详解
2019/10/09 Javascript
js实现div色块拖动录制
2020/01/16 Javascript
Vue项目接入Paypal实现示例详解
2020/06/04 Javascript
简单了解Vue computed属性及watch区别
2020/07/10 Javascript
原生JavaScript实现购物车
2021/01/10 Javascript
[02:18]《我与DAC》之工作人员:为了热爱DOTA2的玩家们
2018/03/28 DOTA
Python合并字典键值并去除重复元素的实例
2016/12/18 Python
PyCharm代码提示忽略大小写设置方法
2018/10/28 Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
2020/02/11 Python
浅谈python锁与死锁问题
2020/08/14 Python
总结Pyinstaller的坑及终极解决方法(小结)
2020/09/21 Python
python 用opencv实现霍夫线变换
2020/11/27 Python
Johnston & Murphy官网: 约翰斯顿·墨菲牛津总统鞋
2018/01/09 全球购物
Zavvi西班牙:电子游戏、极客服装、Blu-ray、Funko Pop等
2019/05/03 全球购物
开普敦通行证:Cape Town Pass
2019/07/18 全球购物
写好自荐信的几个要点
2013/12/26 职场文书
幼儿园元旦家长感言
2014/02/27 职场文书
2014年三八妇女节活动总结
2014/03/01 职场文书
售房协议书范本
2015/08/11 职场文书
学习商务礼仪心得体会
2016/01/22 职场文书
JavaScript实现班级抽签小程序
2021/05/19 Javascript