JavaScript 浮点数运算 精度问题

时间:2022-10-23 16:49:02

JavaScript小数在做四则运算时,精度会丢失,这会在项目中引起诸多不便,先请看下面脚本。

 //加减
 <script type="text/javascript" language="javascript">
 alert(/);//弹出: 0.3333333333333333
 alert(0.09999999 + 0.00000001);//弹出: 0.09999999999999999
 alert(-0.09999999 - 0.00000001);//弹出: -0.09999999999999999
 alert(0.012345 * 0.000001);//弹出: 1.2344999999999999e-8
 alert(0.000001 / 0.0001);//弹出: 0.009999999999999998
 </script>
 <script type="text/javascript" language="javascript">
 alert(/);//弹出: 0.3333333333333333
 alert(0.09999999 + 0.00000001);//弹出: 0.09999999999999999
 alert(-0.09999999 - 0.00000001);//弹出: -0.09999999999999999
 alert(0.012345 * 0.000001);//弹出: 1.2344999999999999e-8
 alert(0.000001 / 0.0001);//弹出: 0.009999999999999998
 </script>
 [code]
 按正常计算的话,除第一行外(因为其本身就不能除尽),其他都应该要得到精确的结果,从弹出的结果我们却发现不是我们想要的正确结果。为了解决浮点数运算不准确的问题,在运算前我们把参加运算的数先升级(10的X的次方)到整数,等运算完后再降级(.1的X的次方)。现收集并整理贴于此,以备后用。
 加法
 Js代码
 [code]
 //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
 //调用:accAdd(arg1,arg2)
 //返回值:arg1加上arg2的精确结果
 function accAdd(arg1,arg2){
 var r1,r2,m;
 ].length}}
 ].length}}
 m=Math.pow(,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 accAdd(arg1,arg2){
 var r1,r2,m;
 ].length}}
 ].length}}
 m=Math.pow(,Math.max(r1,r2))
 return (arg1*m+arg2*m)/m
 }
 //给Number类型增加一个add方法,调用起来更加方便。
 Number.prototype.add = function (arg){
 return accAdd(arg,this);
 }
 减法
 Js代码
 [code]
 //说明:javascript的减法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的减法结果。
 //调用:accSub(arg1,arg2)
 //返回值:arg1减上arg2的精确结果
 function accSub(arg1,arg2){
 return accAdd(arg1,-arg2);
 }
 //给Number类型增加一个sub方法,调用起来更加方便。
 Number.prototype.sub = function (arg){
 return accSub(this,arg);
 }
 //说明:javascript的减法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的减法结果。
 //调用:accSub(arg1,arg2)
 //返回值:arg1减上arg2的精确结果
 function accSub(arg1,arg2){
 return accAdd(arg1,-arg2);
 }
 //给Number类型增加一个sub方法,调用起来更加方便。
 Number.prototype.sub = function (arg){
 return accSub(this,arg);
 }

 //说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
 //调用:accMul(arg1,arg2)
 //返回值:arg1乘以arg2的精确结果
 function accMul(arg1,arg2)
 {
 ,s1=arg1.toString(),s2=arg2.toString();
 ].length}catch(e){}
 ].length}catch(e){}
 ,m)
 }
 //给Number类型增加一个mul方法,调用起来更加方便。
 Number.prototype.mul = function (arg){
 return accMul(arg, this);
 }
 //说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
 //调用:accMul(arg1,arg2)
 //返回值:arg1乘以arg2的精确结果
 function accMul(arg1,arg2)
 {
 ,s1=arg1.toString(),s2=arg2.toString();
 ].length}catch(e){}
 ].length}catch(e){}
 ,m)
 }
 //给Number类型增加一个mul方法,调用起来更加方便。
 Number.prototype.mul = function (arg){
 return accMul(arg, this);
 } 除法
 Js代码
 //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
 //调用:accDiv(arg1,arg2)
 //返回值:arg1除以arg2的精确结果
 function accDiv(arg1,arg2){
 ,t2=,r1,r2;
 ].length}catch(e){}
 ].length}catch(e){}
 with(Math){
 r1=Number(arg1.toString().replace(".",""))
 r2=Number(arg2.toString().replace(".",""))
 ,t2-t1);
 }
 }
 //给Number类型增加一个div方法,调用起来更加方便。
 Number.prototype.div = function (arg){
 return accDiv(this, arg);
 }
 //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
 //调用:accDiv(arg1,arg2)
 //返回值:arg1除以arg2的精确结果
 function accDiv(arg1,arg2){
 ,t2=,r1,r2;
 ].length}catch(e){}
 ].length}catch(e){}
 with(Math){
 r1=Number(arg1.toString().replace(".",""))
 r2=Number(arg2.toString().replace(".",""))
 ,t2-t1);
 }
 }
 //给Number类型增加一个div方法,调用起来更加方便。
 Number.prototype.div = function (arg){
 return accDiv(this, arg);
 }

JavaScript 浮点数运算 精度问题的更多相关文章

  1. PHP浮点数运算精度造成的&comma;订单金额支付经常少1分的问题

    最近碰见一个奇怪的问题,商城通过微信支付的订单经常少一分钱,经过排查是PHP浮点运算精度问题造成的 由PHP浮点数运算精度造成的,鸟哥的Bolg有详细的说明.http://www.laruence.c ...

  2. 如何避开JavaScript浮点数计算精度问题(如0&period;1&plus;0&period;2&excl;&equals;&equals;0&period;3)

    不知道大家在使用JS的过程中有没有发现某些浮点数运算的时候,得到的结果存在精度问题:比如0.1 + 0.2 = 0.30000000000000004以及7 * 0.8 = 5.60000000000 ...

  3. JavaScript 浮点数运算的精度问题

    问题描述 在 JavaScript 中整数和浮点数都属于 Number 数据类型,所有数字都是以 64 位浮点数形式储存,即便整数也是如此. 所以我们在打印 1.00 这样的浮点数的结果是 1 而非 ...

  4. JavaScript浮点数运算的精度问题

    之前在做浮点数计算时,偶然发现计算结果有误差,度娘了解了下,补充整理了下. 误差是什么样子的呢?举例 console.log(0.1+0.2); // 0.30000000000000004 事实上在 ...

  5. 【转】javascript 浮点数运算问题

    大多数语言在处理浮点数的时候都会遇到精度问题,但是在JS里似乎特别严重,来看一个例子 alert(45.6*13); 结果居然是592.800000000001,当然加法之类的也会有这个问题 那这是j ...

  6. js对金额浮点数运算精度的处理方案

    浮点数产生的原因 浮点数转二进制,会出现无限循环数,计算机又对无限循环小数进行舍入处理 js弱语言的解决方案 方法一: 指定要保留的小数位数(0.1+0.2).toFixed(1) = 0.3;这个方 ...

  7. js浮点数运算精度问题

    https://www.cnblogs.com/yadongliang/p/9067333.html

  8. JavaScript 浮点数陷阱及解法

    众所周知,JavaScript 浮点数运算时经常遇到会 0.000000001 和 0.999999999 这样奇怪的结果,如 0.1+0.2=0.30000000000000004.1-0.9=0. ...

  9. JavaScript 浮点数处理

    众所周知,JavaScript 浮点数运算时经常遇到会 0.000000001 和 0.999999999 这样奇怪的结果,如 0.1+0.2=0.30000000000000004.1-0.9=0. ...

随机推荐

  1. ASP&period;NET MVC5&plus;EF6&plus;EasyUI 后台管理系统(2)-easyui构建前端页面框架&lbrack;附源码&rsqb;

    系列目录 前言 为了符合后面更新后的重构系统,本文于2016-10-31日修正一些截图,文字 我们有了一系列的解决方案,我们将动手搭建新系统吧. 后台系统没有多大的UI视觉,这次我们采用的是标准的左右 ...

  2. Log4net在类库中的用法

    app.config应当放置在解决方案的根目录下.具体流程如下: 第一步:应该下载log4net.dll并引入到你的项目中,下载见附件 第二步:需要配置相关的配置文件App.config或Web.co ...

  3. 用Jekyll在github上写博客——《搭建一个免费的,无限流量的Blog》的注脚

    本来打算买域名,买空间,用wordpress写博客的.后来问了一个师兄,他说他是用github的空间,用Jekyll写博客,说很多人都这么做.于是我就研究了一下. 比较有价值的文章有这么几篇: htt ...

  4. Xcode配置libdc1394

    libdc1394是一个开源库,提供了一个Mac下完整的1394相机编程接口,这篇文章将介绍Xcode如何配置该库. 步骤: 1.下载libdc1394的源码,并解压 http://damien.do ...

  5. Some regret&period;&period;&period;&period;

    今天是一个败笔,早上10点才起床,下午又不专心看书,晚上把还是不能静下来...... 把所有的时间都花在了那一篇FlowVisor上了,但是却没有任何收获,居然没看懂,等下好好整理一下逻辑. 明天开始 ...

  6. &lbrack;原创&rsqb;SSIS-WMI 数据读取器任务:监控物理磁盘空间

    背景:       随着时间的推移,我们的DW会越来越大,也就意味着磁盘空间会越来越小,那如果哪一天留意不当,就会造成磁盘空间的不足而导致ETL失败,最终影响我们的系统的数据正确性和使用,更严重的有可 ...

  7. 致命错误: Python&period;h:没有那个文件或目录

    In file included from greenlet.c:5:0: greenlet.h:8:20: 致命错误: Python.h:没有那个文件或目录 编译中断. error: Setup s ...

  8. webView&period;loadUrl&lpar;&quot&semi;file&colon;&sol;&sol;&sol;android&lowbar;asset&sol;table3&period;html&quot&semi;&rpar;出现中文乱码的问题

    webSettings.setDefaultTextEncodingName("UTF-8");

  9. Jmeter之app性能测试(ios,android)

    测试小菜鸟alter今天一大早又学习了一点东西关于jmeter-app性能测试,现在记录一下.提到性能测试,那我就简单总结一下.(想跳过的,直接将页面下移到下一个红色字体处) 性能测试的相关知识介绍 ...

  10. windows 上rsync客户端使用方法

    1.1 获取 windows上实现rsync的软件(cwRsync) cwRsync是Windows 客户端GUI的一个包含Rsync的包装.您可以使用cwRsync快速远程文件备份和同步. 1.1. ...