近日,项目中遇到数值经过数学计算后出现失精度的问题,例如:0.35/10 = 0.034999999999999996。造成这一结果的原因就不再仔细分析了,太繁琐,时间紧也就没仔细去研究。直接说解决方案。

  解决方案也是来自网友的分享,大同小异,有扩展Number,给Number增加方法的,也有定义工具方法的。我采用的是扩展Number 的方式。代码如下:

 // 解决四维运算,js计算失去精度的问题//加法Number.prototype.add = function(arg){var r1,r2,m;try{r1=this.toString().split(".")[1].length}catch(e){r1=0}try{r2=arg.toString().split(".")[1].length}catch(e){r2=0}m=Math.pow(10,Math.max(r1,r2))return (this*m+arg*m)/m
 };//减法Number.prototype.sub = function (arg){return this.add(-arg);};//乘法Number.prototype.mul = function (arg){var m=0,s1=this.toString(),s2=arg.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.prototype.div = function (arg){var t1=0,t2=0,t3=0,r1,r2;try{t1=this.toString().split(".")[1].length}catch(e){}try{t2=arg.toString().split(".")[1].length}catch(e){}try{t3=arg.toString().split(".")[0].length}catch(e){}with(Math){if(this > 1 && (t2 === 0 && arg === pow(10,t3-1))){return this/arg;}else {r1=Number(this.toString().replace(".",""))r2=Number(arg.toString().replace(".",""))return (r1/r2).mul(pow(10,t2-t1));
          }}
};

  其中,网友分享出来的方法中除法原本只有 else 中的内容,但实际使用过程中发现在处理类似于 3.5/10 的时候仍会出现结果失精度的问题,所以擅自添加了个 if 判断。如有其他更好更全面的解决方式,请广大网友不吝留言告知。

  

  另,附上自定义函数的解决方式:

//除法
function accDiv(arg1, arg2) {var t1 = 0, t2 = 0, t3 = 0, r1, r2;try {t1 = arg1.toString().split(".")[1].length} catch (e) {}try {t2 = arg2.toString().split(".")[1].lengtht3 = arg2.toString().split(".")[0].length} catch (e) {}r1 = Number(arg1.toString().replace(".", ""))r2 = Number(arg2.toString().replace(".", ""))if (arg1 > 1 && (t2 === 0 && arg2 === Math.pow(10, t3 - 1))) {return arg1 / arg2;} else {r1 = Number(arg1.toString().replace(".", ""))r2 = Number(arg2.toString().replace(".", ""))return accMul((r1 / r2), Math.pow(10, t2 - t1))}
}
//乘法
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)
}
//加法
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
}
//减法
function Subtr(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));n = (r1 >= r2) ? r1 : r2;return ((arg1 * m - arg2 * m) / m).toFixed(n);
}

转载于:https://www.cnblogs.com/leo-lpf/p/9505657.html

javascript 计算后结果失精度的问题解决相关推荐

  1. 浮点数精度问题透析:小数计算不准确+浮点数精度丢失根源

    在知乎上上看到如下问题: 浮点数精度问题的前世今生? 1.该问题出现的原因 ? 2.为何其他编程语言,比如java中可能没有js那么明显 3.大家在项目中踩过浮点数精度的坑? 4.最后采用哪些方案规避 ...

  2. python 浮点数精度丢失_浮点数精度问题透析:小数计算不准确+浮点数精度丢失根源...

    浮点数精度问题透析:小数计算不准确+浮点数精度丢失根源 无论在java python javaScript里面都存在 1+ 2!== 3 问题,这个问题的产生根源在于计算存储数字是二进制,对无限循环小 ...

  3. c# 取余数 浮点数_浮点数精度问题透析:小数计算不准确+浮点数精度丢失根源

    在知乎上上看到如下问题: 浮点数精度问题的前世今生? 1.该问题出现的原因 ? 2.为何其他编程语言,比如java中可能没有js那么明显 3.大家在项目中踩过浮点数精度的坑? 4.最后采用哪些方案规避 ...

  4. javaScript 计算两个日期的天数相差~~~

    一:计算两个日期相差的天数 比如:    str1  =  "2002-01-20"    str2  =  "2002-10-11"   怎样用javaScr ...

  5. html 表格自动计算,HTML表格中的JavaScript计算

    我是 JavaScript的新手,所以我甚至不知道这是否是尝试这个的正确语言,但我想我会尝试.我已经阅读了其他几篇文章,我找不到真正让我知道如何做到这一点的东西,所以我在这里问.我读过的所有例子都涉及 ...

  6. 探索javascript----获得节点计算后样式

    节点计算后样式是一个属性与属性值的值对对象: IE:    node.currentStyle; 非IE: window.getComputedStyle(node,null); 兼容方式: func ...

  7. 利用Java的BigDecimal与马青公式精确计算π后10000位,

    首先给出公式如下: π=16arctan1/5−4arctan1/239: 即是 π=16×(1/(1×5)−1/(3×5的3次方)+1/(5×5的5次方)-)−4×(1/(1×239)−1/(3×2 ...

  8. #Tomcat# 本地正常但是部署到服务器后,mysql插入中文乱码问题解决!

    一百度,几乎都是大同小异的答案,全都是互相转载的文章.帮助很小 如果你遇到了**Tomcat本地正常!但是部署到服务器后,mysql插入中文乱码问题解决!**这样的问题. 常规的方式都无效,不妨试试下 ...

  9. Tomcat本地正常!但是部署到服务器后,mysql插入中文乱码问题解决!

    一百度,几乎都是大同小异的答案,全都是互相转载的文章.帮助很小 如果你遇到了**Tomcat本地正常!但是部署到服务器后,mysql插入中文乱码问题解决!**这样的问题. 常规的方式都无效,不妨试试下 ...

最新文章

  1. 2020考研公共课_基础精讲课_管理类联考综合能力 联考逻辑(读书笔记)
  2. Module not found: Can‘t resolve ‘@babel/runtime/helpers/esm/extends‘ in ‘C:\Users\wdg\Desktop\Ant-De
  3. 删除有序vector中的重复值c++
  4. jQuery源码研究01
  5. 通信要学很多计算机课吗,辽宁科技学院通信工程专业要学哪些课程,好学吗?...
  6. Qt4_IconEditor窗口部件
  7. nginx.conf nginx设置用户权限
  8. java中元数据是什么_java 元数据
  9. 计算机简历如何写,简历计算机能力怎么写
  10. win10系统mysql重新配置密码
  11. Jmeter的元件使用介绍:前置处理器详解
  12. 【软件通信协议】1. 详细解析TCP/IP通信协议
  13. multipartfile转excel_MultipartFile解析Excel
  14. 腾讯人口密度热力图_从腾讯位置大数据看中国的超级城市,你所处位置是不是很亮?...
  15. 孙俪邓超港籍身份曝光揭明星卯足劲加入港籍
  16. Mysql日志时间与系统时间相差八小时
  17. (完整源码)GPS系统源码,GPSBDpro——SIM卡状态查询
  18. 服务端指南 数据存储篇 | MySQL(03) 如何设计索引
  19. 教你把gps服务器修改为中国加速搜星,手机导航-GPS搜星速度优化(android手机)...
  20. 2023年美国大学生数学建模竞赛赛题发布【英文原文 中文翻译】

热门文章

  1. mysql migration tool 64bit_Migration Tool支持MySQL业务SQL迁移
  2. java中sql 语句格式转换_Java字符串转Sql语句In格式工具方法
  3. 简单的签到代码_【SAS小恩的代码段】02样本分布、两群体与组合差异性检定
  4. android mvp_Android MVP
  5. appenders_Log4j Appenders教程
  6. java 字符串首字符大写_Java字符串为大写
  7. 熊猫DataFrame apply()示例
  8. scala 协变和逆变_Scala方差:协变,不变和逆变
  9. 在Ubuntu上安装Docker –分步指南
  10. Java String trim()方法示例