解决JS浮点数(小数) 运算出现Bug的方法
例如37.2 * 5.5 = 206.08 就直接用JS算了一个结果为: 204.60000000000002 怎么会这样, 两个只有一位小数的数字相乘, 怎么可能多出这么小数点出来。 后来查了下,发现原来这是JavaScript浮点运算的一个bug。

方法 / 步骤
比如: 7 * 0.8 JavaScript算出来就是: 5.6000000000000005 网上找到了一些解决办法, 就是重新写了一些浮点运算的函数或直接扩大倍数运算。 下面就把这些方法摘录下来, 以供遇到同样问题的朋友参考:
在你要用的地方包含这些函数, 然后调用它来计算就可以了。 / 如果在知道小数位个数的前提下, 可以考虑通过将浮点数放大倍数到整型(最后再除以相应倍数), 再进行运算操作, 这样就能得到正确的结果了

  1. <!DOCTYPE html>
  2. <html>
  3.  
  4. <head>
  5. <title>浮点数运算</title>
  6. <meta charset="utf-8">
  7. <meta http-equiv="Pragma" content="no-cache">
  8. <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
  9. </head>
  10. <body>
  11. <script>
  12. /* 解决JS浮点数(小数) 运算出现Bug的方法
  13. 37.2 * 5.5 = 206.08 就直接用JS算了一个结果为: 204.60000000000002 怎么会这样, 两个只有一位小数的数字相乘, 怎么可能多出这么小数点出来。 后来查了下,发现原来这是JavaScript浮点运算的一个bug。
  14.  
  15. 方法 / 步骤
  16. 比如: 7 * 0.8 JavaScript算出来就是: 5.6000000000000005 网上找到了一些解决办法, 就是重新写了一些浮点运算的函数或直接扩大倍数运算。 下面就把这些方法摘录下来, 以供遇到同样问题的朋友参考:*/
  17. /* 在你要用的地方包含这些函数, 然后调用它来计算就可以了。 / 如果在知道小数位个数的前提下, 可以考虑通过将浮点数放大倍数到整型(最后再除以相应倍数), 再进行运算操作, 这样就能得到正确的结果了*/
  18. var jjxx={
  19. /*加法函数,返回值:arg1加上arg2的精确结果*/
  20. numAdd:function(arg1, arg2){
  21. var r1, r2, m;
  22. try {
  23. r1 = arg1.toString().split(".")[].length
  24. } catch (e) {
  25. r1 =
  26. }
  27. try {
  28. r2 = arg2.toString().split(".")[].length
  29. } catch (e) {
  30. r2 =
  31. }
  32. m = Math.pow(, Math.max(r1, r2))
  33. return (arg1 * m + arg2 * m) / m
  34. },
  35. /*减法函数, 返回值:arg1减去arg2的精确结果*/
  36. numSubtract:function(arg1, arg2) {
  37. var r1, r2, m, n;
  38. try {
  39. r1 = arg1.toString().split(".")[].length
  40. } catch (e) {
  41. r1 =
  42. }
  43. try {
  44. r2 = arg2.toString().split(".")[].length
  45. } catch (e) {
  46. r2 =
  47. }
  48. m = Math.pow(, Math.max(r1, r2));
  49. //动态控制精度长度
  50. n = (r1 >= r2) ? r1 : r2;
  51. return ((arg1 * m - arg2 * m) / m).toFixed(n);
  52. },
  53. /*乘法函数 返回值:arg1乘以arg2的精确结果*/
  54. numMultiply:function(arg1, arg2) {
  55. var m = ,
  56. s1 = arg1.toString(),
  57. s2 = arg2.toString();
  58. try {
  59. m += s1.split(".")[].length
  60. } catch (e) {}
  61. try {
  62. m += s2.split(".")[].length
  63. } catch (e) {}
  64. return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(, m)
  65. },
  66. /*除法函数, 返回值:arg1除以arg2的精确结果*/
  67. numDivide:function(arg1, arg2){
  68. var t1 = ,
  69. t2 = ,
  70. r1, r2;
  71. try {
  72. t1 = arg1.toString().split(".")[].length
  73. } catch (e) {}
  74. try {
  75. t2 = arg2.toString().split(".")[].length
  76. } catch (e) {}
  77. with(Math) {
  78. r1 = Number(arg1.toString().replace(".", ""))
  79. r2 = Number(arg2.toString().replace(".", ""))
  80. return (r1 / r2) * pow(, t2 - t1);
  81. }
  82. }
  83. }
  84. </script>
  85. </body>
  86. <script>
  87. alert( * 0.8)
  88. alert(jjxx.numMultiply(,0.8))
  89. </script>
  90. </html>

解决JavaScript浮点数(小数) 运算出现Bug的方法的更多相关文章

  1. 浅谈JavaScript浮点数及其运算

    原文:浅谈JavaScript浮点数及其运算     JavaScript 只有一种数字类型 Number,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的.浮点数的精度问题 ...

  2. JavaScript 浮点数及运算精度调整总结

    JavaScript 浮点数及运算精度调整总结 JavaScript 只有一种数字类型 Number,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的.浮点数的精度问题不是J ...

  3. 解决JS浮点数(小数)计算加减乘除的BUG

    在JavaScript中输出下面这些数值(注意不能作为字符串输出):0.1000000000000000000000000001(28位小数).0.10000000000000000000000000 ...

  4. JavaScript浮点数及其运算

    .普及两个函数Math.pow(底数,几次方)Number.toFixed(小数位数)2.浮点数相加function accAdd(arg1,arg2){   var r1,r2,m;   try{r ...

  5. javascript浮点数转换成整数三种方法

    将浮点数转换成整数方法有很多,分享三种常用方法. Summary 暂时我就想到3个方法而已.如果读者想到其他好用方法,也可以交流一下 parseInt位运算符Math.floor Math.ceil ...

  6. js小数运算出现多位小数如何解决

    小数相乘出现很多位小数的问题:这个问题自己以前也遇到过,现在特意来总结一下: Number类型: Number类型是ECMAScript中最常用和最令人关注的类型了:这种类型使用IEEE754格式来表 ...

  7. 搞懂js中小数运算精度问题原因及解决办法

    js小数运算会出现精度问题 js number类型 JS 数字类型只有number类型,number类型相当于其他强类型语言中的double类型(双精度浮点型),不区分浮点型和整数型. number类 ...

  8. 【Python】解决浮点数间运算存在不确定尾数的问题

    #浮点数间运算存在不确定尾数,所以会输出False if 0.1+0.2==0.3: print("Ture\n") else: print("False\n" ...

  9. JavaScript 浮点数陷阱及解法

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

随机推荐

  1. Java类的根Object

    一.Object类介绍 Object全名java.lang.Object,java.lang包在使用的时候无需显示导入,编译时由编译器自动导入.Object类是类层次结构的根,Java中所有的类从根本 ...

  2. ROS-机器人建模与仿真概论

    前言:无论是因为高昂的设备费用还是为了减少实验次数,仿真都是十分必要的. ROS提供了很多优秀的仿真方式,下面来介绍一下: URDF:Unified Robot Description Format, ...

  3. Centos下MongoDB数据库的安装以及配置开机自启动(三)

    最近写了一个用node来操作MongoDB完成增.删.改.查.排序.分页功能的示例,并且已经放在了服务器上地址:http://39.105.32.180:3333. 在服务器上完全可以用yum来安装管 ...

  4. BZOJ2440: [中山市选2011]完全平方数(莫比乌斯+容斥原理)

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 4920  Solved: 2389[Submit][Sta ...

  5. Python 之 入门须知

    1.Python2.0不支持中文,3.0支持 2.版本问题

  6. Codeforces Round #493 (Div. 2) B. Cutting 前缀和优化_动归水题

    不解释,题目过水 Code: #include<cstdio> #include<cmath> #include<algorithm> using namespac ...

  7. Linux学习01

    Linux学习第一天 1.使用VM安装RHEL7.0 具体参见刘遄老师的<Linux就该怎么学>https://www.linuxprobe.com/chapter-01.html 2.R ...

  8. Mysql字段合并

    现有数据 合并字段显示:利用GROUP_CONCAT(course,":","score") 严格区分大小写!GROUP_CONCAT 复制代码 SELECT ...

  9. pytorch 7 optimizer 优化器 加速训练

    import torch import torch.utils.data as Data import torch.nn.functional as F import matplotlib.pyplo ...

  10. Vijos 1456 最小总代价 (状压dp)

    看到这道题n只有16,就可以想到状压dp 每个人只有经过或者没经过,那就用1表示经过,0表示没经过 但是不是当前在谁那里,所以再加一维来记录 所以f[state][i]表示在物品在i,当前的状态是st ...