前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >js数字计算精度问题修正

js数字计算精度问题修正

作者头像
OECOM
发布2020-07-01 17:18:40
3.1K0
发布2020-07-01 17:18:40
举报
文章被收录于专栏:OECOMOECOM

问题描述

程序计算是一个很普遍的存在,但是语言的计算精度却是一个困扰人的问题,比说说,计算0.1+0.2,0.3+0.6,不用计算机计算,你用口算当然可以计算出分别为0.3和0.9,但是计算机计算的结果却不一样

js数字计算精度问题修正
js数字计算精度问题修正

这是加法中存在问题,乘法当中依然存在,你可以用程序计算一下4330.61*100,计算结果依然是不准确。

js数字计算精度问题修正
js数字计算精度问题修正

当着写计算结果应用到金钱的计算上的时候,就会出现大的问题,N笔交易以后产生的效果更大。所以需要一种方法来解决。至于产生的原因可以参考=>js浮点数精度问题的前世今生?

解决方法

浮点数计算本身就有精度缺失的问题,要解决他首先就不进行浮点数运算,就是将其转变为整数,然后再进行除法,换算为浮点数。

先看乘法运算

代码语言:javascript
复制
function mul(a, b) {
      var c = 0,
        d = a.toString(),
        e = b.toString();
      try {
        c += d.split(".")[1].length;
      } catch (f) {}
      try {
        c += e.split(".")[1].length;
      } catch (f) {}
      return Number(d.replace(".", "")) * Number(e.replace(".", "")) / Math.pow(10, c);
    }

首先,将两个需要运算的数字进行字符串化,然后依次判断小数点后有几位,因为后面需要进行除法,所以这里的小数点位数需要相加,然后将字符串化后的两个值去除小数点,在进行数字化,此时两个数字都已经变成了整数,此时在进行乘法运算,得出精确的结果,之后再除以因为去除小数点放大的倍数,由此得出精确地计算结果。

其他的运算就不在一一叙述了。

代码语言:javascript
复制
;(function(){
  function mathService(){
    this.add=function(a,b){
      var c, d, e;
      try {
        c = a.toString().split(".")[1].length;
      } catch (f) {
        c = 0;
      }
      try {
        d = b.toString().split(".")[1].length;
      } catch (f) {
        d = 0;
      }
      return e = Math.pow(10, Math.max(c, d)), (this.mul(a, e) + this.mul(b, e)) / e;
   }

   this.mul=function(a, b) {
      var c = 0,
        d = a.toString(),
        e = b.toString();
      try {
        c += d.split(".")[1].length;
      } catch (f) {}
      try {
        c += e.split(".")[1].length;
      } catch (f) {}
      return Number(d.replace(".", "")) * Number(e.replace(".", "")) / Math.pow(10, c);
    }

   this.sub=function(a,b){
     var c, d, e;
     try {
       c = a.toString().split(".")[1].length;
     } catch (f) {
       c = 0;
     }
     try {
       d = b.toString().split(".")[1].length;
     } catch (f) {
       d = 0;
     }
     return e = Math.pow(10, Math.max(c, d)), (this.mul(a, e) - this.mul(b, e)) / e;
   }

   this.div=function(a, b) {
     var c, d, e = 0,
       f = 0;
     try {
       e = a.toString().split(".")[1].length;
     } catch (g) {}
     try {
       f = b.toString().split(".")[1].length;
     } catch (g) {}
     return c = Number(a.toString().replace(".", "")), d = Number(b.toString().replace(".", "")), this.mul(c / d, Math.pow(10, f - e));
   }
  }

  window.mathService=new mathService()

})(window);
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-07-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解决方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档