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.js:一个大数数学库的更多相关文章

  1. js javascirpt 数学库、 算法库 (转载)

    提示:国外官网,谷歌浏览器右键可以翻译成中文. 1.math.js 官网:https://mathjs.org/index.html 其它简介:https://www.jianshu.com/p/4f ...

  2. Chapter 18_0 数学库

    从今天起,开始接触Lua的标准库(数学库.table库.字符库.I/O库.操作系统库.调试库). 一路走来,从最基本的变量.函数.迭代器.协同程序到稍微复杂的元表.元方法.环境.模块,以及最后被整蒙了 ...

  3. XNA数学库

    XNA Math Vectors 在direct3D 9 和10中,包含3D数学库的D3DX库支持向量和其他核心类型的计算.在direct11中,D3DX库不在包含3D数学库,取而代之的是XNA数学库 ...

  4. 20个必不可少的Python库也是基本的第三方库

    个属于我常用工具的Python库,我相信你看完之后也会觉得离不开它们.他们是: Requests.Kenneth Reitz写的最富盛名的http库.每个Python程序员都应该有它. Scrapy. ...

  5. 一个很cool的C#的高性能数学库

    High Performance Math Library for C# and .NET是一个很cool的C#的高性能数学库,3D效果也很不错,下图是首页上的一个例子.他也有一个交互的网页,你可以自 ...

  6. 我发起并创立了一个 Javascript 前端库 开源项目 jWebForm

    在线演示地址: ( 在线演示 云平台 由 Kooboo 提供  https://www.kooboo.com/ ) 按钮:      http://iwebform.kgeking.kooboo.si ...

  7. 【全网首发】鸿蒙开源三方组件--强大的弹窗库XPopup组件

    目录: 1.介绍 2.效果一览 3.依赖 4.如何使用 5.下载链接 6.<鸿蒙开源三方组件>文章合集 1. 介绍 ​ XPopup是一个弹窗库,可能是Harmony平台最好的弹窗库.它从 ...

  8. 自己写一个JS单向数据流动库----one way binding

    JS单向流动其实就是数据到视图的过程, 这几天突发奇想,想着弄一个插件, 把DOM结构使用JS进行描述: 因为DOM中的Class , content, id, attribute, 事件, 子元素全 ...

  9. 开源自己写的一个拖拽库,兼容到IE8+

    github地址:https://github.com/qiangzi7723/draggable 目前这个库的兼容做到了兼容IE8,所以如果需要兼容IE8的朋友不妨试试.库里面写了很多的注释,对于想 ...

  10. Tesseract.js 一个几乎能识别出图片中所有语言的JS库

    Tesseract.js 一个几乎能识别出图片中所有语言的JS库. 官网:http://tesseract.projectnaptha.com/ git:https://github.com/napt ...

随机推荐

  1. 项目实战:Qt多段Y轴折线图框架(双Y轴段折线、支持拽拖、浮动游标显示X值各段Y值、支持大量实时显示下位机数据)

    若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/111660400长期持续带来更多项目与技术分享, ...

  2. Java面向对象之接口和抽象类的区别一目了然

    介绍 相信对于Java面向对象部分,很多人很长一段时间对于接口和抽象类的区别,使用场景都不是很熟悉,同是作为抽象层重要的对象,工作中到底什么情况下使用抽象类,不是很清楚.本文就一次性把这些概念一次性说 ...

  3. 【Azure 应用服务】App Service 项目部署成功后,应用连接 Azure Redis时报错 Could not get a resource from the pool

    问题描述 App Service 项目部署成功后,需要连接到同在云上的Redis服务, Redis启动了专用终结点,只能在于Redis同一个VNET(虚拟网络)的资源能够访问.在进入App Servi ...

  4. Metasploitable3 渗透测试

    1.信息手机阶段 信息收集经常使用的软件 功能也比较强大的Nmap Nmap nmap -p- -sS -sV -n -v --reason --open -oX demon.xml 192.168. ...

  5. Zabbix技术分享——snmp异常排查指南

    大家好,我是乐乐.在IT运维中,难免会碰上设备snmp不通的情况,那么,当问题出现的时候,运维工程师该如何快速找到问题所在呢?下面让我们一起来看看吧!   1.IP配置检查 首先检查zabbix监控上 ...

  6. 基于STM32F407MAC与DP83848实现以太网通讯二(DP83848硬件配置以及寄存器)

    参考内容:DP83848数据表 一.PHY DP83848功能模块图 DP83848的硬件模块主要为: MII/RMII/SNI INTERFACES:用于与MAC数据传输的MII/RMII/SNI接 ...

  7. Vue3 写业务逻辑不适合用TS(TypeScript)

    TypeScript 最重要的就是装饰器 Vue3最重要更新就是Setup 装饰器就是为了打散功能点,Vue3的Setup功能也是打散功能点,那用Vue3上TS,感觉就是自己给自己多一层工作量. 我这 ...

  8. C#项目管理引用的dll文件

    这篇文章主要简单记录一下C#项目的dll文件管理方法,以便后期使用. 设置dll路径 参考C#开发奇技淫巧三:把dll放在不同的目录让你的程序更整洁中间的 方法一:配置App.config文件的pri ...

  9. Ambiq Micro-AMA3B2KK-KBR芯片可穿戴产品解决方案开发之RTC时钟

    一 RTC   RTC的英文全称是Real-Time Clock,翻译过来是实时时钟芯片.绝大多数mcu芯片都集成了这个功能.在可穿戴产品中,时间往往是非常重要的因素,怎么让时间保持一直在运行,那就是 ...

  10. 2.4G无线音频传输方案市场调研分析

    基本概念   所谓的2.4G音频传输,不是使用标准的wifi和蓝牙协议传输,而是使用私有的2.4G通信协议来实现点对点,一对多和多对一的音频传输.2.4G私有协议音频传输,有这低延时,距离远,声音高清 ...