GVKun编程网logo

js小数计算引起的精度误差问题(js小数计算引起的精度误差问题有哪些)

16

本篇文章给大家谈谈js小数计算引起的精度误差问题,以及js小数计算引起的精度误差问题有哪些的知识点,同时本文还将给你拓展0.1+0.2不等于0.3,微信小程序云开发如何解决JavaScript小数计算

本篇文章给大家谈谈js小数计算引起的精度误差问题,以及js小数计算引起的精度误差问题有哪些的知识点,同时本文还将给你拓展0.1+0.2不等于0.3,微信小程序云开发如何解决JavaScript小数计算精度失准的问题、008_浮点数误差问题、c++如何提高浮点数计算的精度?、int型的精度比float的精度高等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

js小数计算引起的精度误差问题(js小数计算引起的精度误差问题有哪些)

js小数计算引起的精度误差问题(js小数计算引起的精度误差问题有哪些)

我记得刚开始学js的时候学到浮点有举例0.1+0.2 它的计算结果是:

0.1+0.2
0.30000000000000004

很神奇的一个计算,js是弱语言,在精度上没做处理;

我就自己定义了加减乘除:

加:

export const accAdd = (arg1, arg2) => {
  let 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;
};
 
export function accSub(arg1, arg2) {
  let 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(2);
}
 
export const accMul = (arg1, arg2) => {
  let 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)
  );
};
 
export function accDiv(arg1, arg2) {
  let t1 = 0,
    t2 = 0,
    r1,
    r2;
  try {
    t1 = arg1.toString().split(''.'')[1].length;
  } catch (e) {}
  try {
    t2 = arg2.toString().split(''.'')[1].length;
  } catch (e) {}
  r1 = Number(arg1.toString().replace(''.'', ''''));
  r2 = Number(arg2.toString().replace(''.'', ''''));
  return (r1 / r2) * Math.pow(10, t2 - t1);
}
 
这和网上搜出来的
(num1* 100 + num2* 100) / 100
去控制两位小数相加基础上去写;
 
每天都在打代码中学习
 

0.1+0.2不等于0.3,微信小程序云开发如何解决JavaScript小数计算精度失准的问题

0.1+0.2不等于0.3,微信小程序云开发如何解决JavaScript小数计算精度失准的问题

先看图

在这里插入图片描述
这个是JavaScript语言自身存在的一个问题。说道这里不得不提一下网上流传的JavaScript搞笑图

在这里插入图片描述

我们在使用云开发来开发微信小程序的时候,会经常遇到JavaScript小数计算精度失准的问题。特别是实现钱包计算的功能。虽然整数计算不会出错,但总不能要求微信小程序内都是整数计算吧,这不科学。

 title=
那么开发小程序涉及到小数计算的时候,如何防止小数计算精度失准。

其实有很多方法,这里主要推荐我觉得比较好的解决办法。就是使用math.js这个npm包来实现计算。

业务逻辑如下图

在这里插入图片描述

废话少说,直接上代码!!!

建一个calculation云函数,代码如下:

// 云函数入口文件
const cloud = require(''wx-server-sdk'')
const TcbRouter = require(''tcb-router''); //云函数路由
const math = require(''mathjs''); //云函数路由
cloud.init({
  env:''''  //填入你的环境ID
})


// 云函数入口函数
exports.main = async (event, context) => {
      const app = new TcbRouter({
          event
      });
      //乘法
      app.router(''multiply'', async(ctx) => {
          var value = math.multiply(math.bignumber(event.num1), math.bignumber(event.num2))
          ctx.body = math.round(value,2)  //四舍五入,并且保留2位小数
      });
      //除法
      app.router(''divide'', async(ctx) => {
          var value = math.divide(math.bignumber(event.num1), math.bignumber(event.num2))
          ctx.body = math.round(value,2)  //四舍五入,并且保留2位小数
      });
      //加法
      app.router(''sum'', async(ctx) => {
          var value = math.add(math.bignumber(event.num1), math.bignumber(event.num2))
          ctx.body = math.round(value,2)  //四舍五入,并且保留2位小数
      });
      //减法
      app.router(''subtract'', async(ctx) => {
          var value = math.subtract(math.bignumber(event.num1), math.bignumber(event.num2))
          ctx.body = math.round(value,2)  //四舍五入,并且保留2位小数
      });
      return app.serve();
}

写完云函数的代码了,记得安装math.js计算库和tcb-router云函数路由的依赖包。

安装依赖包步骤,右击名为calculation云函数文件夹,再点击“在外部终端窗口中打开”,然后输入依次输入命令:npm install mathjs和npm install tcb-router。安装成功后,点击“上传并部署:云端安装依赖(不上传node_modules)”即可部署完成云函数。

前端(小程序端)请求代码如下:

      wx.cloud.callFunction({
        name: ''calculation'',
        data: {
              $url: "multiply", //云函数路由参数,示例参数是乘法
              num1:that.data.price,
              num2:that.data.rate,
        },
        success: res => {
              console.log(res.result.value)  //计算结果
        },
        fail(e) {
              console.log(e)
        }
      });

$url这个是填土云函数路由参数的,上面代码的是表示乘法,如果想让云函数计算加法,我们可以传入“add”作为参数即可。

这里我们使用了云函数路由,这样我们可以把加减乘除的算法都合并到一个云函数里,节俭很多代码

end
欢迎关注微信公众号:小秃僧

008_浮点数误差问题

008_浮点数误差问题

一、浮点数

  a):float类型又被称作单精度类型,尾数可以精确到7位有效数字,在很多情况下,float类型的精度很难满足需求。

  b):double表示这种类型的数值精度是float类型的两倍,又被称作双精度,绝大部分应用程序都采用double类型。

二、浮点数的表述范围

  

类型

占用存储空间

表数范围

float

4字节

-3.403E38~3.403E38

double

8字节

-1.798E308~1.798E308

三、在java中表示浮点数的两种表示形式

  a):十进制形式         如:3.14       314.0      0.314

  b):科学记数法形式  如: 314e-2      3.14e2      314E-3

四、测试浮点数代码:  

public class TestFloadAndDoubleType {

    public static void main(String[] args) {
        /*
        [X]因为浮点数默认是double类型、而float f=0.1中0.1默认是double类型的、
        这样的话将一个8个字节的double类型转换为4个字节的float类型会出现编译错误
        为了明确其类型我们在后面加f
        */
        //float a=0.1;//[X]错误的
        float b=0.1f;//[√]加f来明确其类型、正确的
        //浮点数可以用科学计数法来表示
        double c=314e-2;//3.14
        double d=314e-3;//0.314
        System.out.println("double c=314e-2中c的执行结果为: c="+c);
        System.out.println("double d=314e-3中d的执行结果为: d="+d);
        //浮点数的比较(注意:浮点数运算结果比较存在误差问题、所以不能精确比较)
        double e=1.0/10; //0.1
        System.out.println("浮点数运算结果误差示例:0.1f==1.0/10其比较结果为:"+(b==e));
        float d1 = 423432423f;
        float d2 = d1+1;
        /**
         * 二进制表示浮点数误差问题
         */
        System.out.println("d1="+d1);
        System.out.println("d2="+d2);
        System.out.println("423432423f==423432423f+1的比较结果为: "+(d1==d2));//天呐尽然误差到相当?
    }
}

测试结果为:

  

 

五、总结

  a):浮点数的默认类型为double类型

  b):浮点类型float, double的数据类型不适合在不允许有舍入误差的金融计算领域

  c):由于浮点数占用存储空间有限,所以能够精确表示的数是有限的,因而也是离散的。浮点数一般都存在舍入误差,很多数字无法精确表示,其结果只能是接近,但不等于。

  d):二进制浮点数不能精确的表示0.1,0.01,0.001这样10的负次幂。并不是所有的小数都能可以精确的用二进制浮点数表示。

  e):如果需要进行不产生舍入误差的精确数字计算大小数使用BigDecimal类、大整数BigInteger

  注意:通过以上我们对浮点类型的了解、我们应该避免编程中使用浮点类型进行的运算结果的比较

c++如何提高浮点数计算的精度?

c++如何提高浮点数计算的精度?

  请教大侠们有没有好的解决方案?(另外想起,“神七”的项目中要提高相当的精度是怎么做到的呵呵~)

int型的精度比float的精度高

int型的精度比float的精度高

从精度上来说,int型比float的精度要高。

单精度浮点数虽然由32位组成,但是其中有1位符号位,8位指数,只有23位是数值尾数。也就是说它的精度仅为23位。

而整型int也由32位组成,它只有1位是符号位,剩下的31位都是数值尾数。

谁的精度高显而易见。

关于js小数计算引起的精度误差问题js小数计算引起的精度误差问题有哪些的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于0.1+0.2不等于0.3,微信小程序云开发如何解决JavaScript小数计算精度失准的问题、008_浮点数误差问题、c++如何提高浮点数计算的精度?、int型的精度比float的精度高等相关知识的信息别忘了在本站进行查找喔。

本文标签: