在 Sway 中,有多种原始数字类型:
u8
(8位无符号整数) u16
(16位无符号整数) u32
(32位无符号整数) u64
(64位无符号整数) u256
(256位无符号整数) 本指南解释了如何在使用 SDK 时创建和操作 Sway 数字。
u64
和 u256
当您从 JavaScript 传递 u64
或 u256
到 Sway 程序时,必须首先将其转换为 BigNum
对象。这是因为这些类型的最大值可以非常大(分别为 2^64
和 2^256
),而 JavaScript 的 Number
类型只能容纳高达 53 位的精度(2^53
)。
import { bn } from 'fuels';
const originalNumber = 20;
const bigNumber = bn(originalNumber);
expect(bigNumber.toNumber()).toEqual(originalNumber);
您还可以从字符串创建 BigNum
。当您想要传递无法表示为 JavaScript 数字的大数字时,这很有用。以下是如何做到这一点的示例:
import { bn } from 'fuels';
const originalNumber = '9007199254740992';
const bigNumber = bn(originalNumber);
expect(bigNumber.toString()).toEqual(originalNumber);
u8
、u16
和 u32
您不需要做任何特殊操作来创建这些数字。您可以直接传递一个 JavaScript 数字。有关更多详细信息,请参见下面的示例。
u64
和 u256
const originalNumber = 20;
const { value } = await contract.functions.echo_u64(bn(originalNumber)).call();
expect(value.toNumber()).toEqual(originalNumber);
注意:如果合约调用返回的数字太大,无法表示为 JavaScript 数字,则可以使用
.toString()
方法将其转换为字符串,而不是.toNumber()
。
u8
、u16
和 u32
const originalNumber = 20;
const { value } = await contract.functions.echo_u8(originalNumber).call();
expect(value).toEqual(originalNumber);
ethers
中的 BigNum
与 fuels
import { toBigInt } from 'ethers';
import { bn } from 'fuels';
const originalNumber = 20;
const ethersBigNum = toBigInt(originalNumber);
const fuelsBigNum = bn(ethersBigNum.toString());
expect(fuelsBigNum.toNumber()).toEqual(originalNumber);