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

  1. //加减
  2. <script type="text/javascript" language="javascript">
  3. alert(/);//弹出: 0.3333333333333333
  4. alert(0.09999999 + 0.00000001);//弹出: 0.09999999999999999
  5. alert(-0.09999999 - 0.00000001);//弹出: -0.09999999999999999
  6. alert(0.012345 * 0.000001);//弹出: 1.2344999999999999e-8
  7. alert(0.000001 / 0.0001);//弹出: 0.009999999999999998
  8. </script>
  9. <script type="text/javascript" language="javascript">
  10. alert(/);//弹出: 0.3333333333333333
  11. alert(0.09999999 + 0.00000001);//弹出: 0.09999999999999999
  12. alert(-0.09999999 - 0.00000001);//弹出: -0.09999999999999999
  13. alert(0.012345 * 0.000001);//弹出: 1.2344999999999999e-8
  14. alert(0.000001 / 0.0001);//弹出: 0.009999999999999998
  15. </script>
  16. [code]
  17. 按正常计算的话,除第一行外(因为其本身就不能除尽),其他都应该要得到精确的结果,从弹出的结果我们却发现不是我们想要的正确结果。为了解决浮点数运算不准确的问题,在运算前我们把参加运算的数先升级(10X的次方)到整数,等运算完后再降级(.1X的次方)。现收集并整理贴于此,以备后用。
  18. 加法
  19. Js代码
  20. [code]
  21. //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
  22. //调用:accAdd(arg1,arg2)
  23. //返回值:arg1加上arg2的精确结果
  24. function accAdd(arg1,arg2){
  25. var r1,r2,m;
  26. ].length}}
  27. ].length}}
  28. m=Math.pow(,Math.max(r1,r2))
  29. return (arg1*m+arg2*m)/m
  30. }
  31. //给Number类型增加一个add方法,调用起来更加方便。
  32. Number.prototype.add = function (arg){
  33. return accAdd(arg,this);
  34. }
  35. //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
  36. //调用:accAdd(arg1,arg2)
  37. //返回值:arg1加上arg2的精确结果
  38. function accAdd(arg1,arg2){
  39. var r1,r2,m;
  40. ].length}}
  41. ].length}}
  42. m=Math.pow(,Math.max(r1,r2))
  43. return (arg1*m+arg2*m)/m
  44. }
  45. //给Number类型增加一个add方法,调用起来更加方便。
  46. Number.prototype.add = function (arg){
  47. return accAdd(arg,this);
  48. }
  49. 减法
  50. Js代码
  51. [code]
  52. //说明:javascript的减法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的减法结果。
  53. //调用:accSub(arg1,arg2)
  54. //返回值:arg1减上arg2的精确结果
  55. function accSub(arg1,arg2){
  56. return accAdd(arg1,-arg2);
  57. }
  58. //给Number类型增加一个sub方法,调用起来更加方便。
  59. Number.prototype.sub = function (arg){
  60. return accSub(this,arg);
  61. }
  62. //说明:javascript的减法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的减法结果。
  63. //调用:accSub(arg1,arg2)
  64. //返回值:arg1减上arg2的精确结果
  65. function accSub(arg1,arg2){
  66. return accAdd(arg1,-arg2);
  67. }
  68. //给Number类型增加一个sub方法,调用起来更加方便。
  69. Number.prototype.sub = function (arg){
  70. return accSub(this,arg);
  71. }
  72.  
  73. //说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
  74. //调用:accMul(arg1,arg2)
  75. //返回值:arg1乘以arg2的精确结果
  76. function accMul(arg1,arg2)
  77. {
  78. ,s1=arg1.toString(),s2=arg2.toString();
  79. ].length}catch(e){}
  80. ].length}catch(e){}
  81. ,m)
  82. }
  83. //给Number类型增加一个mul方法,调用起来更加方便。
  84. Number.prototype.mul = function (arg){
  85. return accMul(arg, this);
  86. }
  87. //说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
  88. //调用:accMul(arg1,arg2)
  89. //返回值:arg1乘以arg2的精确结果
  90. function accMul(arg1,arg2)
  91. {
  92. ,s1=arg1.toString(),s2=arg2.toString();
  93. ].length}catch(e){}
  94. ].length}catch(e){}
  95. ,m)
  96. }
  97. //给Number类型增加一个mul方法,调用起来更加方便。
  98. Number.prototype.mul = function (arg){
  99. return accMul(arg, this);
  100. } 除法
  101. Js代码
  102. //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
  103. //调用:accDiv(arg1,arg2)
  104. //返回值:arg1除以arg2的精确结果
  105. function accDiv(arg1,arg2){
  106. ,t2=,r1,r2;
  107. ].length}catch(e){}
  108. ].length}catch(e){}
  109. with(Math){
  110. r1=Number(arg1.toString().replace(".",""))
  111. r2=Number(arg2.toString().replace(".",""))
  112. ,t2-t1);
  113. }
  114. }
  115. //给Number类型增加一个div方法,调用起来更加方便。
  116. Number.prototype.div = function (arg){
  117. return accDiv(this, arg);
  118. }
  119. //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
  120. //调用:accDiv(arg1,arg2)
  121. //返回值:arg1除以arg2的精确结果
  122. function accDiv(arg1,arg2){
  123. ,t2=,r1,r2;
  124. ].length}catch(e){}
  125. ].length}catch(e){}
  126. with(Math){
  127. r1=Number(arg1.toString().replace(".",""))
  128. r2=Number(arg2.toString().replace(".",""))
  129. ,t2-t1);
  130. }
  131. }
  132. //给Number类型增加一个div方法,调用起来更加方便。
  133. Number.prototype.div = function (arg){
  134. return accDiv(this, arg);
  135. }

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

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

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

  2. 如何避开JavaScript浮点数计算精度问题(如0.1+0.2!==0.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. jQuery中的模拟操作

    jQuery中的模拟操作主要是通过trigger来触发,相当于页面加载完成后不需要用户点击按钮,就可以自动触发页面中的相关事件. trigger(type,[data])可以用来模拟触发自定义事件的触 ...

  2. php中文件引入require

    ./ 表示当前层 ../表示向上一层 php中好像不能像asp那样,用 “/” 表示根目录,但可以用$_SERVER['DOCUMENT_ROOT'] 表示网站根目录 引用分为三种: 上级对下级的引用 ...

  3. MongoDB-启动的时候出现了问题

    之前MongoDB启动的时候是正常的,不知道后来启动报错了,就把粘贴出来查询了.最后才知道是由于自己不正常的关闭导致的这个情况. --摘录:MongoDB非正常关闭后修复记录 mongod没有后台执行 ...

  4. Flask学习记录之Flask-Login

    Flask-Loging 可以方便的管理用户会话,保护路由只让认证用户访问 http://flask-login.readthedocs.org/en/latest/ 一.初始化Flask-Login ...

  5. iTunes 安装终极解决方案

    近日手贱升级了Itunes,升级过程即报失败,然后卸载所有相关东西,再重装,Itunes安装成功,但是报告无法使用iphone,经过几天摸索,发现是Apple Mobile Device Suppor ...

  6. cf C. Counting Kangaroos is Fun

    http://codeforces.com/contest/373/problem/C 贪心,先排序,然后从n/2位置倒着找每一个可不可以放到别的袋鼠内. #include <cstdio> ...

  7. ISO15693协议的Inventory

    ISO15693的Inventory指令看起来比较让人迷糊,想明白其流程,我认为以下几点是必须了解的: 第一.ISO15693标签的几种状态,资料上有,这里罗嗦重复一下: 1.PowerOff状态 2 ...

  8. 【HDOJ】4325 Flowers

    树状数组+离散化的题目,一直在思考为什么结果不一样,后来才发现花开了就是开了不会再谢了. /* 4325 */ #include <iostream> #include <cstdi ...

  9. Ultra-QuickSort(归并排序求逆序对数)

    Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 34283   Accepted: 12295 Description In ...

  10. Nodejs in Visual Studio Code 04.Swig模版

    1.开始 设置Node_Global:npm config set prefix "C:\Program Files\nodejs" Express组件:npm install e ...