C# "Integral constant is too large" - 整数变量对于 Int32 类型来说太大

C# "Integral constant is too large" - Integer variable too large for Int32 type

我正在建造一个 ASP.NET 核心 API,returns 周期性 table 和太阳系中的行星。主要是玩玩API调用,还有.NET中的数据类型。在 Visual Studio 2017 年构建。

我对行星的质量 属性 有疑问,以千克为单位。显然是一个大整数,所以我尝试将它声明为 long、Ulong、Int64 甚至 UInt64。但是,当我尝试输入一个新的行星模型并输入质量时,出现以下错误:

struct System.Int32
Represents a 32 bit signed integer.
Integral constant is too large.

这是我的 PlanetModel.cs 描述 属性:

...
public UInt64 Volume { get; set; } //In Kilometers
public Int64 Mass { get; set; } //In Kilograms
public float Gravity { get; set; } //In m/s^2
...

然而,当我转到 PlanetDataStore.cs 时,这里是我尝试使用数据构建对象的地方。

new PlanetModel()
                {
                    Position = 1,
                    Name = "Mercury",
                    Distance = 57909050, //In Kilometers
                    Orbit = 0.240846F, //In years
                    SolarDay = 0.5F, //In Days
                    Radius = 2439, //In Kilometers
                    Volume = 60830000000, // In Kilometers
                    Mass = 330110000000000000000000, //In Kilograms
                    Gravity = 3.7F, //In m/s^2
                },

我在我的 Mass 中的第一个“3”处收到一个红色波浪形错误,错误如上。然而,当我将鼠标悬停在 Mass 上时,它会显示:“long PlanetMode.Mass {get; set;} 当我将鼠标悬停在等号上时,它会显示:"struct System.Int64"

错在哪里?为什么我的 属性 声明为 64 位整数,但值卡在 32 位?

在 C# 中,长文字必须以 L 为后缀

Mass = 123456789012345L

尽管这显然不能使您在 long 中存储大于 64 位的数字 :)

为什么不使用浮点类型?

这里有一个小问题,Int64/UInt64 的最大值远小于您要分配的数字。

换句话说:

330,110,000,000,000,000,000,000   //Your number
9,223,372,036,854,775,807         //Int64 Max Value
18,446,744,073,709,551,615        //UInt64 Max Value

您的数字对于该数据类型来说太大了。

虽然我对它的经验为零,但如果您使用的是 .NET 4.0 或更高版本,您也许可以使用 BigInteger

我不确定您从哪里获得结构和类型信息,但即使在 Int64,该值也只是 too largeInt64.MaxValue 是:

9223372036854775807

你有:

330110000000000000000000

即使是无符号数,数量级也太大了。您可以使用 something like BigInteger instead.

你的值对于 Int64 来说太长了,long 也是 64 位的。您可以在 Int64 中存储的最大数字是 (2^64 - 1)/2 = 9,223,372,036,854,775,807

您可以将此数字存储为浮点数。如果您想将数字存储为浮点数,则必须告诉编译器它是一个浮点数。

查看浮点数的存储方式以获得更好的理解。如果你想把它存储在一个浮点数中,你可以这样做 330110000000000000000000.0f

正如其他人所指出的,您的数字太大,无法放入 UInt64 结构中。 因此,您将需要 BigInteger,或者可能需要另一种更广泛的可变数字类型,例如 double。所以你的模型声明 Mass 属性 像这样:

public double Mass { get; set; } //In Kilograms

接下来,您必须在数字文字后加上 D,如下所示:

Mass = 330110000000000000000000D, //In Kilograms

您照常格式化数字显示:

mercury.Mass.ToString("N0");

Obviously a large integer

这绝不是显而易见的。地球的质量不是整数千克数。您不应该为此应用程序使用任何整数类型。将整数用于 真正 整数的事物,例如序列中的元素数。

使用 double 表示精确测量到小数点后十位的物理量。质量、体积、长度、力等应始终为双精度值。

这也可以让您摆脱那些难以阅读的数字。双打让你使用科学记数法,因为 双打是为了科学:

Mass = 3.3011E23,

此外,在我们研究您的解决方案时,我注意到对于球形行星,可以根据半径计算体积。您可能不想同时存储两者;相反,只需存储一个并在需要时计算另一个。

我还注意到你有一个 "distance",它似乎是 Mercury 的半长轴。为什么只存储半长轴,为什么不直接称呼它呢?

我还注意到您到处都混淆了单位——米和公里、天和年等等。为什么不将所有内容都保留在标准单位中?长度为米,时间为秒,质量为千克。当您始终如一地使用标准单位时,您会发现您犯的愚蠢的算术错误会更少。