mathjs处理精度丢失问题

官网

官网:math.js | an extensive math library for JavaScript and Node.js

github:GitHub - josdejong/mathjs: An extensive math library for JavaScript and Node.js

npm地址:mathjs - npm

mathjs特点:

  • 支持数字、大数、复数、分数、单位、字符串、数组和矩阵。
  • 与 JavaScript 的内置数学库兼容。
  • 包含一个灵活的表达式解析器。
  • 进行符号计算。
  • 带有大量内置函数和常量。
  • 也可以用作命令行应用程序。
  • 在任何 JavaScript 引擎上运行。
  • 易于扩展。
  • 开源。

Math.js 可以在 node.js 和浏览器中使用。

使用npm安装 math.js :

npm install mathjs

或者通过下载页面上列出的 CDN 之一下载 mathjs:

   <script src="https://cdn.bootcdn.net/ajax/libs/mathjs/10.6.1/math.min.js"></script>

mathjs使用方式

mathjs获取操作值的方法

  1. valueof()
  2. done()
  3. format()
  4. ...

用静态函数和常数(就像JavaScript的Math对象)

math.round(math.e, 3);            // 2.718
math.add(2, 3);  // 5 
math.sqrt(-4);  // 2i 
math.pow([[-1, 2], [3, 1]],2);     // [[7, 0], [0, 7]]
math.derivative('x^2 + x', 'x');  // 2 * x + 1
math.atan2(3, -3) / math.pi;      // 0.75

mathjs 大数

未使用大数bignumber,计算结果会出现精度问题

math.bignumber('2.3e+500') // BigNumber, 2.3e+500
print(math.add(0.1, 0.2)) // number, 0.30000000000000004
print(math.multiply(10.22, 100)). //1022.0000000000001
print(math.divide(0.3, 0.2)) // number, 1.4999999999999998

第一种:

可以使用以下函数创建 BigNumber,解决js计算的精度问题

print(math.add(math.bignumber(0.1), math.bignumber(0.2))) // BigNumber, 0.3
print(math.divide(math.bignumber(0.3), math.bignumber(0.2))) // BigNumber, 1.5

第二种:

大多数函数可以根据输入的类型确定输出的类型:一个数字作为输入将返回一个数字作为输出,一个 BigNumber 作为输入返回一个 BigNumber 作为输出。无法确定输入输出类型的函数(例如math.evaluate)使用默认数字类型number,可以在实例化 math.js 时配置。要配置默认使用 BigNumbers 而不是数字,请像这样配置 math.js:

const { create, all } = require('..')

// configure the default type of numbers as BigNumbers
const config = {
  number: 'BigNumber',
  precision: 64, 
}
const math = create(all, config)



math.evaluate('0.1 + 0.2')  // BigNumber, 0.3

 BigNumber 的默认精度为 64 位,可以使用选项配置

加减乘除

使用bignumber进行示例:

​math.add(math.bignumber(0.1), math.bignumber(0.2)) // 加法 BigNumber, 0.3
math.subtract(math.bignumber(1), math.bignumber(0.9)) // 减法 BigNumber, 0.1
math.multiply(math.bignumber(4.10), math.bignumber(100)) // 乘法 BigNumber, 410
math.multiply(math.bignumber(10.22), math.bignumber(100)) //乘法 10.22
math.ceil(math.bignumber(6.10)/ math.bignumber(0.1));   //除法 向上取整 61
math.floor(math.bignumber(6.10)/ math.bignumber(0.1));   //除法 向下取整 61
math.round(math.bignumber(6.10)/ math.bignumber(0.1));   // 除法 四舍五入 61

猜你喜欢

转载自blog.csdn.net/u011200562/article/details/130886469
今日推荐