zoukankan      html  css  js  c++  java
  • js计算不准确 解决方案

    作为前端首先要明白一点,在某些时候js的计算是不准确的,简单的比如:0.1+0.2.

    因为js使用的是双精度浮点数来计算的(具体是啥我也不知道,大概就是二进制),0.1,0.2这样的仔二进制中相当于1/3这样的无限小数。

    简单来讲对于js计算来说,整数的计算是没问题的,但是关于小数位的计算就会出现精度丢失的问题。

    那么解决方案来了:把小数转换为整数来进行计算。

    (当然了也可以引入很多计算库,比如我使用的就是 mathjs)

    var [a,b] = [0.1,0.2];//定义两个变量

    首先,我们需要判断是否是带有小数点:

    var [a1,b1] = [0,0]
    try{a1 = (a*1).toString().split('.')[1].length}catch{a1=0}
    try{b1 = (b*1).toString().split('.')[1].length}catch{b1=0}
    //此处是获取两个数据里面的小数的位数
    //此处之所以 *1是为了避免我们一时疏忽传入了字符串类型,*1可以将数字类型的字符串转换为数字
    

    然后,就是把数据转换为整数了:

    var c = Math.pow(10,Math.max(a1,b1));
    //这个是获取两个位数中最大的小数位数,并且返回10的n次幂
    
    var d = (a*1*c) + (b*1*c);
    //此时计算的是整数相加的结果,还不是最后结果
    
    var e = d /c;
    //将整数结果除去10的n次幂,得到的就是最终结果
    

    最后,完整代码:

     
    var [a,b] = [0.1,0.2];

    var [a1,b1] = [0,0]
    try{a1 = (a*1).toString().split('.')[1].length}catch{a1=0}
    try{b1 = (b*1).toString().split('.')[1].length}catch{b1=0}
    var c = Math.pow(10,Math.max(a1,b1));
    var e = ((a*1*c) + (b*1*c))/c;
    //e:0.3

    减、乘、除与加类似,就不多赘述啦。

  • 相关阅读:
    31、状态模式(详解版)
    33、中介者模式(详解版)
    36、备忘录模式(详解版)
    34、迭代器模式(详解版)
    30、责任链模式(职责链模式)详解
    29、命令模式(详解版)
    32、观察者模式(Observer模式)详解
    37、解释器模式(详解版)
    35、访问者模式(Visitor模式)详解
    28、策略模式(策略设计模式)详解
  • 原文地址:https://www.cnblogs.com/sixrookie/p/15561168.html
Copyright © 2011-2022 走看看