Icon Link数字

在 Sway 中,有多种原始数字类型:

  1. u8(8位无符号整数)
  2. u16(16位无符号整数)
  3. u32(32位无符号整数)
  4. u64(64位无符号整数)
  5. u256(256位无符号整数)

本指南解释了如何在使用 SDK 时创建和操作 Sway 数字。

Icon Link创建数字

Icon Link对于 u64u256

当您从 JavaScript 传递 u64u256 到 Sway 程序时,必须首先将其转换为 BigNum 对象。这是因为这些类型的最大值可以非常大(分别为 2^642^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);

Icon Link对于 u8u16u32

您不需要做任何特殊操作来创建这些数字。您可以直接传递一个 JavaScript 数字。有关更多详细信息,请参见下面的示例。

Icon Link示例:与合约方法交互中的数字

Icon Link对于 u64u256

const originalNumber = 20;
 
const { value } = await contract.functions.echo_u64(bn(originalNumber)).call();
 
expect(value.toNumber()).toEqual(originalNumber);
Icon InfoCircle

注意:如果合约调用返回的数字太大,无法表示为 JavaScript 数字,则可以使用 .toString() 方法将其转换为字符串,而不是 .toNumber()

Icon Link对于 u8u16u32

const originalNumber = 20;
 
const { value } = await contract.functions.echo_u8(originalNumber).call();
 
expect(value).toEqual(originalNumber);

Icon Link使用 ethers 中的 BigNumfuels

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);