在内部,我们使用任意精度 算术(也称为大数算术)来处理大数字和不同的资产。
在 Fuel 网络上,我们使用 9 位小数来表示单位下的金额。这取决于不同的链,所以了解您正在使用的链上使用的小数位数是很重要的。
注意:
@fuels/assets
包提供了一组资产及其小数位数的列表。
以下我们将介绍单位转换的一些常见用例。
使用我们的 BN
类,我们可以实例化这些数字。
// #import { BN };
const result = new BN('100000000').toString();
// "100000000"
或者使用我们的 bn
实用函数。
// #import { bn };
const result = bn('100000000').toString();
// "100000000"
通常,当我们从 JavaScript 向 Sway 程序传递 u64
和 u256
数字时,我们需要将它们转换为 BN
对象。有关更多信息,请参阅此处 。
const MAX_U64 = bn('18446744073709551615');
const { value } = await contract.functions.echo_u64(MAX_U64).call();
value.toString();
// "18446744073709551615"
注意:如果合约调用返回的数字太大,无法表示为 JavaScript 数字,您可以使用
toString
方法而不是toNumber
将其转换为字符串。
解析字符串表示的数字(来自用户输入)从未如此简单,使用 parseUnits
函数。
const result = bn.parseUnits('0.000000001').toString();
// "1"
我们可以解析大数字。
const result = bn.parseUnits('100100').toString();
// "100100000000000"
或者格式化为人类可读的数字。
const result = bn.parseUnits('100,100.000200001').toString();
// "100100000200001"
我们还可以解析其他计量单位的数字。
// #import { bn, DECIMAL_GWEI };
const result = bn.parseUnits('1', DECIMAL_GWEI).toString();
// "1000000000"
我们可以使用 format
函数格式化常见的计量单位。
在下面的示例中,我们将一个表示一个 Gwei 的 BigNumber 格式化为 Fuel 网络的单位(保留 3 位小数)。
const oneGwei = bn('1000000000');
const result = oneGwei.format();
// "1.000"
我们还可以通过指定 units
变量来格式化其他计量单位的数字。
// #import { bn, DECIMAL_GWEI };
const twoGwei = bn('2000000000');
const result = twoGwei.format({ units: DECIMAL_GWEI });
// "2.000"
precision
变量将允许格式化具有特定小数位数的数字。
const oneGwei = bn('1000000000');
const result = oneGwei.format({ precision: 1 });
// "1.0"
formatUnits
函数是 format
函数的一个较小的替代方案,因为它将保持与输入值相同的精度。
const oneGwei = bn('1000000000');
const result = oneGwei.formatUnits();
// "1.000000000"
我们还可以通过指定 units
变量来格式化其他计量单位的数字。
// #import { bn, DECIMAL_KWEI };
const oneKwei = bn('1000000000000000');
const result = oneKwei.formatUnits(DECIMAL_KWEI);
// "1.000000000000000"