解决javascript计算精度问题之math.js引入及计算实例(16进制转10进制计算)

790 阅读2分钟

image.png

1.安装

npm install mathjs

2.引入

import * as math from "mathjs"

3.从根本解决javascript 0.1+0.2 的问题

math.bignumber()
这个方法让我决定使用math.js库来解决前端计算精度问题,简直不要太好用,哈哈

接下来让我们看看到底怎么解决的精度计算

    console.log(math.bignumber('0.1'));
    console.log(math.bignumber('0.2'));
    const numadd = math.add(math.bignumber('0.1'), math.bignumber('0.2'));
    console.log(numadd);
    console.log(numadd.toString());

控制台输出:

image.png

看完这个栗子,彻底悟了么宝子们,什么叫从根本解决计算精度问题!

4.使用方法

math.bignumber('x')//数字转换成支持无限精度无限大数的类BigNumber实现
math.sqrt(4) //开方
math.add(a,b) //加
math.subtract(a,b) //减
math.divide(a,b) //除
math.multiply(a,b) //乘
math.pow(a,b) //取数值平方
math.ceil(x) //向上取整:函数返回大于或等于一个给定数字的最小整数
math.Floor(x)//向下取整:返回小于或等于一个给定数字的最大整数
math.round()//四舍五入:函数返回一个数字四舍五入后最接近的整数
math.random()//伪随机数:函数返回一个浮点,  伪随机数在范围 **[0,1)** ,也就是说,从0(包括0)往上,
但是不包括1(排除1),然后您可以缩放到所需的范围。实现将初始种子选择到随机数生成算法;它不能被用户选择或重置
math.abs()//取绝对值:函数返回指定数字 “x“ 的绝对值
math.cbrt()//取数值立方根:函数返回任意数字的立方根
math.max(*value1*[,*value2*, ...])//取最大值:函数返回一组数中的最大值
math.min()//取最小值
math.trunc()//取整数部分:方法会将数字的小数部分去掉,只保留整数部分

5.十六进制转十进制原理

www.rapidtables.com/convert/num…

6.十六进制转十进制实栗

 // 16进制数转10进制
  private ex16hex(value) {
    const valueReplace = value.replace('0x', '');
    let arr = valueReplace.split('');
    arr = arr.reverse();
    let res = math.bignumber('0');
    const list = [];
    arr.forEach((item, i) => {
      const num = this.hex_change(item);
      list.push(this.muti16(num, i));
    });
    res = list.reduce(function (prev, cur) {
      return math.add(prev, cur);
    });
    return res.toString();
  }

  // 字符转16进制数字
  private hex_change(item) {
    let res;
    switch (item) {
      case 'a':
      case 'A':
        res = 10;
        break;
      case 'b':
      case 'B':
        res = 11;
        break;
      case 'c':
      case 'C':
        res = 12;
        break;
      case 'd':
      case 'D':
        res = 13;
        break;
      case 'e':
      case 'E':
        res = 14;
        break;
      case 'f':
      case 'F':
        res = 15;
        break;
      case '1':
      case '2':
      case '3':
      case '4':
      case '5':
      case '6':
      case '7':
      case '8':
      case '9':
        res = Number(item);
        break;
      default:
        res = 0;
        break;
    }
    return res;
  }

  // 返回 v 乘以 n 个 16 的积
  private muti16(v, n) {
    const pow = math.pow(math.bignumber('16'), math.bignumber(`${n}`));
    return math.multiply(math.bignumber(`${v}`), pow);
  }