在新公司的第一个项目是区块链相关的管理后台和交易所,其中就涉及了很多的计算问题。而JavaScript因为存在计算的精度问题,所以直接计算就可能会导致各种各样的bug,为了解决这个问题,就要使用BigNumber.js这个库。

至于为什么JavaScript会有精度问题呢,可以看这里。简单来说就是因为:JavaScript中所有的数字(包括整数和小数)都只有一种类型–Number。它的实现遵循IEEE 754标准,使用64位固定长度来表示,也就是标准的double双精度浮点数。它的优点是可以归一化处理整数和小数,节省储存空间。而实际计算的时候会转换成二进制计算再转成十进制。进制转换之后会很长,舍去一部分,计算再转回来,就有了精度误差。

BigNumber.js是一个用于任意精度计算的js库。可以在 官方文档 的console中测试使用。也可以通过npm install bignumber.js --save来安装。然后 import BigNumber from 'bignumber.js' 来引入使用。他的大概原理是将所有数字当做字符串,重新实现了计算逻辑。缺点是性能比原生的差很多。

现在 TC39 已经有一个 Stage 3 的提案 proposal bigint,大数问题有望彻底解决。在浏览器正式支持前,可以使用 Babel 7.0 来实现,它的内部是自动转换成 big-integer 来计算,要注意的是这样能保持精度但运算效率会降低。

具体用法可以参考以下资料:

  • 官方文档
  • bignumber.js使用记录
  • BigNumber 讲解

就不再敖述了,下边随便写点常用的方法:

// 转为 bignumber
const x= new BigNumber('123456789.123456789');
// 转为 普通数字
x.toNumber()// 格式化(小数点)
x.toFormat()    // '123,456,789.123456789'
x.toFormat(3)   // '123,456,789.123'// 计算
x.plus(0.1)  // 加法
x.minus(0.1)  // 减法
x.times(0.1)  // 乘法
x.div(0.1)  // 除法
x.mod(3)  // 取模/取余// 比较大小
x.eq(y) // isEqualTo 的简写,是否相等
x.gt(y) // isGreaterThan 的简写,是否大于
x.gte(y) // isGreaterThanOrEqualTo 的简写,是否大于等于
x.lt(y) // isLessThan 的简写,是否小于
x.lte(y) // isLessThanOrEqualTo 的简写,是否小于等于// 取非,改变数字的正负号
x.negated() 

BigNumber.js相关推荐

  1. big.js、bignumber.js 和 decimal.js 的区别

    原文网址:big.js.bignumber.js 和 decimal.js 的区别_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍3个JavaScript的数字处理第三方库的区别,它们是:bi ...

  2. BigNumber.js数值计算-解决精度问题

    BigNumber.js-文档 特征 整数和小数 简单的API,但功能齐全 比Java的BigDecimal的JavaScript版本更快,更小,甚至更容易使用 缩小并压缩8 KB 复制toExpon ...

  3. JS中调用bignumber处理高精度小数运算

    ignumber.js用于数字精度要求较高的计算. bignumber.js源码地址:https://github.com/MikeMcl/bignumber.js 1.下载bignumber.js. ...

  4. JS中使用bignumber处理高精度小数运算

    项目开发中发现精度丢失的问题,如0.1+0.2 = 0.30000000000000004的问题 解决方式:引用bignumber.js用于数字精度要求较高的计算. 1.安装或引用: 下载地址:htt ...

  5. JS中使用bignumber处理高精度小数 失去去精确度运算 bigNumber用法

    项目开发中发现精度丢失的问题,如0.1+0.2 = 0.30000000000000004的问题 解决方式:引用bignumber.js用于数字精度要求较高的计算. 1.安装或引用:      下载地 ...

  6. JS中bignumber处理高精度小数运算的使用

    JS中bignumber处理高精度小数运算的使用 安装或引用 bignumber.js的API地址: 静态方法 实例方法 项目开发中发现精度丢失的问题,如0.1+0.2 = 0.30000000000 ...

  7. web3.js(三)查询智能合约币数量(erc20)

    需要获取到智能合约地址+智能合约ABI 1.打开https://etherscan.io/ 搜索cmt,跳转到该页面,点击红色区域,跳转到智能合约地址 2.address是智能合约地址,点击Contr ...

  8. web3.js(二)根据私钥推出地址查询以太数量

    安装web3+bignumber.js+ethereumjs-util npm i web3 -s npm i bignumber.js -s npm i ethereumjs-util -s cod ...

  9. web3.js(一)根据地址查询以太数量

    安装web3+bignumber.js npm i web3 -s npm i bignumber.js -s code: const Web3 = require("web3") ...

  10. paip.最好的脚本语言node js 环境搭建连接mysql

    paip.最好的脚本语言node js 环境搭建连接mysql #====下载node...走十一个exe..容易的.. 1 #0----Hello world   .js 2 #---------模 ...

最新文章

  1. ejb 3中bean的种类
  2. Entity Framework 批量插入
  3. html语义化有哪些优点,语义化的HTML结构到底有什么好处?
  4. C++ STL 容器之 deque简单使用
  5. [导入]ASP.NET MVC框架开发系列课程(1):MVC模式与ASP.NET MVC框架概述.zip(8.80 MB)
  6. 怎么自己打印餐饮小票_自己怎么做餐饮外卖配送系统?可以开发外卖配送系统的公司有哪些?...
  7. android 玩pc游戏,Shield掌机试玩: Android系统 可玩PC单机游戏
  8. 滑动轨迹 曲线 python_python曲线图
  9. 英语总结系列(二十七):重复就是力量
  10. Git命令行介绍和使用说明(持续更新)
  11. YYYY-mm-dd HH:MM:SS大小写解释
  12. RFC2544测试指标
  13. 【Paper】DeepConvLSTM:Deep Convolutional and LSTM RNN for Multimodal Wearable Activity Recognition
  14. kd树的根节点_多维空间分割树--KD树
  15. IntelliJ IDEA 设置快捷键(Keymap)
  16. windows图片和传真查看器
  17. gps校正 android,通过GPS时间同步Android设备?
  18. F - Shifting String(置换的阶+思维)
  19. opencv-python——调用摄像头录制并保存视频
  20. 《坂上之云》电影手记

热门文章

  1. python爬取网课答案_高校邦网络数据采集与Python爬虫【带实验】网课答案
  2. Go语言适合做什么?
  3. 算术平均数、几何平均数、调和平均数的、标准差、方差、正态分布、异常值噪声处理
  4. 计算机与网络时间同步,电脑时间同步,教您怎么让电脑时间和网络时间同步
  5. zrst指令是什么意思_三菱PLC梯形图所有指令符号是什么意思?
  6. 图像的简单copyPaste实现
  7. 平板电脑也可以学python吗?10 个Python 编辑器,,让编程更贴近生活~
  8. 高频消息中间件面试题解析
  9. html设置线条颜色渐变,CSS3 - 设置渐变颜色背景,线性/放射性/循环(附在线渐变生成工具)...
  10. 图纸打印什么时候用蓝图_为什么工程图纸都是蓝色的?是叫“蓝图”吗?