Skip to content

关于计算

由于 js 精度不准确的问题:

js
0.1 + 0.2 === 0.3; // false
0.1 + 0.2 === 0.3; // false

所以,凡是与计算有关的,可使用bpMath

加减乘除

js
const t = bpAdd('0.1', '0.2', '0.3'); // 即:0.1+0.2+0.3

const t = bpAdd('0.1', '0.2', '0.3', { deci: 3 }); // 约3位小数,四舍五入

const t = bpAdd('0.1', '0.2', '0.3', { deci: -3 }); // 约3位小数,并向下约

const t = bpAdd('0.1', '0.2', '0.3', { hex: true }); // 转成ethers的16进制的bigNumber

const t = bpAdd('0.1', '0.2', '0.3', { hex: true, deci: 3 }); // 转成ethers的16进制的bigNumber, 精度位3
const t = bpAdd('0.1', '0.2', '0.3'); // 即:0.1+0.2+0.3

const t = bpAdd('0.1', '0.2', '0.3', { deci: 3 }); // 约3位小数,四舍五入

const t = bpAdd('0.1', '0.2', '0.3', { deci: -3 }); // 约3位小数,并向下约

const t = bpAdd('0.1', '0.2', '0.3', { hex: true }); // 转成ethers的16进制的bigNumber

const t = bpAdd('0.1', '0.2', '0.3', { hex: true, deci: 3 }); // 转成ethers的16进制的bigNumber, 精度位3

减法

js
const t = bpSub('0.1', '0.2', '0.3'); // 即:0.1 - 0.2 - 0.3
const t = bpSub('0.1', '0.2', '0.3'); // 即:0.1 - 0.2 - 0.3

乘法

js
const t = bpMul('0.1', '0.2', '0.3'); // 即:0.1 * 0.2 * 0.3
const t = bpMul('0.1', '0.2', '0.3'); // 即:0.1 * 0.2 * 0.3

除法

js
const t = bpDiv('0.1', '0.2', '0.3'); // 即:0.1 * 0.2 * 0.3
const t = bpDiv('0.1', '0.2', '0.3'); // 即:0.1 * 0.2 * 0.3

一些与合约交互的时候,需要带上精度

比如 bsc 中 USDT 的精度为 18,触发 transfer:

js
const cloneAmount = bpMul(amount, 10 ** 18);
const { status } = await bpWrite(
  { success: $t('msg.5') },
  coinObj.value.transfer,
  收款地址,
  cloneAmount
);
const cloneAmount = bpMul(amount, 10 ** 18);
const { status } = await bpWrite(
  { success: $t('msg.5') },
  coinObj.value.transfer,
  收款地址,
  cloneAmount
);

两个数的比较

a < b?

js
const res = bpLt(a, b);
const res = bpLt(a, b);

a <= b?

js
const res = bpLte(a, b);
const res = bpLte(a, b);

a > b?

js
const res = bpGt(a, b);
const res = bpGt(a, b);

a >= b?

js
const res = bpGte(a, b);
const res = bpGte(a, b);

将普通字符串转为 ethers16 进制的 bigNumber

js
const cloneNum = bpEthHex('99', 18);
const cloneNum = bpEthHex('99', 18);

将 ethers 的 16 进制 bigNumber 转为 String

转为整数

js
const num = bpFormat(bigNum);
const num = bpFormat(bigNum);

保留 3 位小数,并四舍五入

js
const num = bpFormat(bigNum, 3);
const num = bpFormat(bigNum, 3);

保留 3 位小数,并向下取

js
const num = bpFormat(bigNum, -3);
const num = bpFormat(bigNum, -3);

bigNumber 来自是 6 位精度的, 转为带 3 位小数

js
const num = bpFormat(bigNum, 3, 6);
const num = bpFormat(bigNum, 3, 6);

将一个数进行四舍五入

js
const num = bpFixed(bigNum, 3);
const num = bpFixed(bigNum, 3);

四舍五入,不足补 0

js
const num = bpFixed(bigNum, 3, true);
const num = bpFixed(bigNum, 3, true);

将一个数向下取

js
const num = bpFloor(bigNum, 3);
const num = bpFloor(bigNum, 3);

向下取,不足补 0

js
const num = bpFloor(bigNum, 3, true);
const num = bpFloor(bigNum, 3, true);

bpEmpty

判断一个数据是否为空,返回 true 则为空

  1. 可以判断 vue 的 ref

  2. 如果是对象,所有 value 为空,则这个数据也为空

simpleZero

将小数前面的 0 简写

参数类型描述
参数一string要修改的字符串
参数二number足够 0 开始的长度(默认 2:前面超过 2 个 0 才执行)
参数三number截取的长度(默认 4:截取{0}后面最多 4 个非 0 数)
"3.00000014"  --->  "3.{6}14"

即:这里的{6}表示小数的前方有 6 个 0

即:这里将小数前面的 6 个 0 简写成{6}

只有符合这种前面带 0 的格式才会被转换,否则直接打回原数据

注意:一般联合bpDiv使用,而不是联合bpFormat使用

例子:

js
simpleZero(bpDiv(val, 10 ** 18));
simpleZero(bpDiv(val, 10 ** 18));
js
simpleZero(bpDiv(val, 10 ** 18), 2, 3);
simpleZero(bpDiv(val, 10 ** 18), 2, 3);

Released under the MIT License.