首页 > 其他分享 >【开源三方库】bignumber.js:一个大数数学库

【开源三方库】bignumber.js:一个大数数学库

时间:2023-08-21 12:11:17浏览次数:46  
标签:bignumber BigNumber ohpm js 开源 toString new

OpenHarmony(OpenAtom OpenHarmony简称“OpenHarmony”)三方库,是经过验证可在OpenHarmony系统上可重复使用的软件组件,可帮助开发者快速开发OpenHarmony应用。如果是发布到开源社区,称为开源三方库,开发者可以通过访问开源社区获取。接下来我们来了解bignumber.js开源三方库。

bignumber.js是一个数学库,用于任意精度十进制和非十进制算术的 JavaScript 库。

特点

● 整数和小数。

● 简单的 API,但功能齐全。

● 比Java的BigDecimal JavaScript版本更快,更小,也许更容易使用。

● 8 KB 缩小和压缩。

● 复制 JavaScript 的 Number 类型的 、 和 方法toExponential、toFixed、toPrecision、toString。

● 包括一个和正确舍入的方法toFraction  squareRoot。

● 支持加密安全的伪随机数生成。

● 无依赖关系。

● 广泛的平台兼容性:仅使用 JavaScript 1.5 (ECMAScript 3) 功能。

使用场景

JavaScript因为存在计算的精度问题,所以直接计算就可能会导致各种各样的bug,为了解决这个问题,就可以使用BigNumber.js这个库。它的大概原理是将所有数字当做字符串,重新实现了计算逻辑。

使用示例

1.  安装bignumber.js

ohpm install bignumber.js

  

OpenHarmony ohpm 环境配置等更多内容,请参考如何安装 OpenHarmony ohpm 包

2.  导入bignumber.js

import BigNumber from "bignumber.js";

  

3.  调用接口

let x = new BigNumber(123.4567);
let y = BigNumber('123456.7e-3');
let z = new BigNumber(x);
expect(x).assertEqual(y);
expect(y).assertEqual(z);
expect(x).assertEqual(z);

  

       该库导出单个构造函数 BigNumber,该函数接受 Number、String 或 BigNumber 类型的值。

 
let x = new BigNumber('1111222233334444555566');
x.toString();                       // "1.111222233334444555566e+21"
x.toFixed();                        // "1111222233334444555566"

  

要获取BigNumber的字符串值,请使用toString()或toFixed()。

//使用超过15个有效数字的数字文字会导致精度损失。
new BigNumber(1.0000000000000001)         // '1'
new BigNumber(88259496234518.57)          // '88259496234518.56'
new BigNumber(99999999999999999999)       // '100000000000000000000'

//使用数值范围之外的数字文字会导致精度损失。
new BigNumber(2e+308)                     // 'Infinity'
new BigNumber(1e-324)                     // '0'

//Number值的算术运算的意外结果导致精度损失。
new BigNumber(0.7 + 0.1)                  // '0.7999999999999999'

  

        如果不太了解数字值的有限精度,建议从字符串值而不是数字值创建 BigNumbers,以避免潜在的精度损失。

new BigNumber(Number.MAX_VALUE.toString(2), 2)

  

       从数字创建大数时,请注意,大数是从数字的十进制值创建的,而不是从其基础二进制值创建的。如果需要后者,则传递 Number 的值并指定基数 2.toString()或toString(2)。

a = new BigNumber(1011, 2)          // "11"
b = new BigNumber('zz.9', 36)       // "1295.25"
c = a.plus(b)   

  

      可以从 2 到 36 的基数中的值创建大数字。请参阅ALPHABET以扩展此范围。

0.3 - 0.1                           // 0.19999999999999998
x = new BigNumber(0.3)
x.minus(0.1)                        // "0.2"
x                                   // "0.3"  

  

         如果未为十进制值指定基数 10,则性能更好。仅当要将输入值的小数位数限制为当前INK http://mik 设置时,才指定基数 10。BigNumber 是不可变的,因为它不会被其方法更改。

x.dividedBy(y).plus(z).times(9)
x.times('1.23456780123456789e+9').plus(9876.5432321).dividedBy('4444562598.111772').integerValue()                                // "0.3"  

  

      返回 BigNumber 的方法可以链接。

x = new BigNumber(255.5)
x.toExponential(5)                  // "2.55500e+2"
x.toFixed(5)                        // "255.50000"
x.toPrecision(5)                    // "255.50"
x.toNumber()                        //  255.5

  

     BigNumber与JavaScript的Number类型一样,有toExponential,toFixed和toPrecision方法。

x.toString(16)                     // "ff.8"

  

可以为toString指定基数。

如果没有指定基数10,即使用toString()而不是toString(10),则性能会更好。如果要将字符串的小数位数限制为当前的DECIMAL_PLACES设置,请仅指定基数10。

y = new BigNumber('1234567.898765')
y.toFormat(2)                       // "1,234,567.90"

  

有一种toFormat方法可能对国际化有用。

y = new BigNumber(355)
pi = y.dividedBy(113)               // "3.1415929204"
pi.toFraction()                     // [ "7853982301", "2500000000" ]
pi.toFraction(1000)                 // [ "355", "113" ]

  

有一个toFraction方法,它有一个可选的最大分母参数。

x = new BigNumber(NaN)                                           // "NaN"
y = new BigNumber(Infinity)                                      // "Infinity"
x.isNaN() && !y.isNaN() && !x.isFinite() && !y.isFinite()

  

以及isNaN和isFinite方法,因为和是有效值。NaN、Infinity、BigNumber。

x = new BigNumber(-123.456);
x.c                                 // [ 123, 45600000000000 ]  coefficient (i.e. significand)
x.e                                 // 2                        exponent
x.s                                 // -1                       sign

  

BigNumber的值以系数、指数和符号的十进制浮点格式存储。

//为原始BigNumber构造函数设置DECIMAL_LACES
BigNumber.set({ DECIMAL_PLACES: 10 })

// 创建另一个BigNumber构造函数,可选地传入配置对象
BN = BigNumber.clone({ DECIMAL_PLACES: 5 })

x = new BigNumber(1)
y = new BN(1)

x.div(3)                            // '0.3333333333'
y.div(3)                            // '0.33333'

  

为了高级使用,可以创建多个BigNumber构造函数,每个构造函数都有自己的独立配置。

源码地址&ohpm仓地址

以上就是bignumber.js的一些基本介绍,更多详情可以前往源码地址或者ohpm仓地址参考bignumber.js文档。

参考资料

[如何安装 OpenHarmony ohpm 包]: gitee.com/openharmony…

bignumber.js API:ohpm.openharmony.cn/#/cn/detail…

源码地址:gitee.com/openharmony…

ohpm地址:ohpm.openharmony.cn/#/cn/detail…

 

点击关注阅读原文,了解更多资讯

 

标签:bignumber,BigNumber,ohpm,js,开源,toString,new
From: https://www.cnblogs.com/openharmony/p/17645683.html

相关文章

  • 应用管理平台Walrus开源,构建软件交付新范式
    今日,数澈软件Seal(以下简称“Seal”)宣布正式开源Walrus,这是一款基于平台工程理念的应用管理平台,致力于解决应用交付领域的深切痛点。 借助Walrus将云原生的能力和最佳实践扩展到非容器化环境,并支持任意应用形态统一编排部署,降低使用基础设施的复杂度,为研发和运维团队提供易用......
  • JS的执行还分是谁发起的?
    这一部分首先我们考虑一下,如果我们是浏览器或者Node的开发者,我们该如何使用JavaScript引擎。当拿到一段JavaScript代码时,浏览器或者Node环境首先要做的就是;传递给JavaScript引擎,并且要求它去执行。然而,执行JavaScript并非一锤子买卖,宿主环境当遇到一些事件时,会继续......
  • 应用管理平台Walrus开源,构建软件交付新范式
    今日,数澈软件Seal(以下简称“Seal”)宣布正式开源Walrus,这是一款基于平台工程理念的应用管理平台,致力于解决应用交付领域的深切痛点。 借助Walrus将云原生的能力和最佳实践扩展到非容器化环境,并支持任意应用形态统一编排部署,降低使用基础设施的复杂度,为研发和运维团队提供易用......
  • 主流开源分析引擎梳理,看看你最中意谁?| StoneDB数据库观察
    编者荐语:本文来自石原子合伙人祁国辉老师,主要对主流的开源分析引擎进行详尽的分析,干货满满,欢迎大家阅读学习。最近一段时间,我重新梳理了一下目前市面上主流的数据分析引擎,发现真是琳琅满目,令人眼花缭乱。静下心来花了两周时间横向看了一下,学习过程中,记了一些笔记,希望能够......
  • Threejs用官方提供的编辑器做一个简单的模型
    Threejs有提供一个web端的编辑器制作3D模型,地址是https://threejs.org/editor/,这个打开就可以在线编辑,但是因为比较简陋,所以只能做一些简单的模型用于测试,实际开发中还是用blender这种标准的建模软件来建模,首先打开页面可以看到下面的画面,(是英文版本的,不过单词都比较简单,可以凑合看......
  • Nop平台为什么是一个独一无二的开源软件开发平台
    在当今数字化时代,开源软件开发平台为开发者提供了更多的灵活性和自由度。然而,市场上有很多选择,但Nop平台却是一个独一无二的开源软件开发平台。本文将介绍Nop平台的特点以及为什么它与众不同。1.Nop平台的背景Nop平台是一个开源的电子商务解决方案,具有强大的功能和灵活的架构......
  • Mesa 23.2 开源图形栈现已可供下载
    导读作为Mesa23系列的第二个重要版本,Mesa23.2开源图形栈现已可供下载,它为AMDGPU的RADVVulkan驱动程序带来了新功能,改进了 Linux 游戏,并新增了Asahi功能。Mesa23.2的亮点包括Asahi上的OpenGL3.1和OpenGLES3.VK_KHR_ray_tracing_pipeline、VK_EXT......
  • 开源.NetCore通用工具库Xmtool使用连载 - 散列算法篇
    【Github源码】《上一篇》详细介绍了Xmtool工具库中的加解密类库,今天我们继续为大家介绍其中的散列算法类库。散列算法在某些特殊场景也可以当做加密方法使用;其特点是不可逆,同一内容每次散列值绝对一致,所以也可用作对数据内容是否被篡改的校验方法;或者其他需要唯一性编码的场景;本......
  • 在Windows系统上,给perl安装JSON::parse module
    管理员身份打开powershell,一定以管理员身份打开:输入下面两行命令即可 cpanApp::cpanminuscpanmJSON::Parse JSON::Parse指南:https://metacpan.org/pod/JSON::Parse perlmodule安装指南:https://www.cpan.org/modules/INSTALL.html......
  • WordPress、Drupal和Joomla!等PHP系统的对比分析 - 开源CMS比较
    选择一个适合自己网站的内容管理系统(CMS)是非常重要的。在众多的选择中,我们经常听到的有WordPress、Drupal和Joomla!等PHP系统。本文将对这三个开源CMS进行详细的比较和分析,帮助您做出最佳选择。1.WordPressWordPress是目前最受欢迎的开源CMS之一,它简单易用且拥有强大的生态系统......