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



我正在构建一个ASP.NET核心API,该API返回周期表和太阳系中的行星。主要使用API调用以及.NET中的数据类型。在Visual Studio 2017中构建此。

我的行星大众属性有问题,以公斤为单位。显然是一个大整数,所以我尝试将其宣布为长,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
                },

我在质量中的第一个" 3"上遇到了一个红色错误,上面的错误。然而,当我鼠标鼠标过于质量时,它写着:"长planetmode.mass {get; set;}当我在等价上鼠标时,它读取:" struct system.int64"

在哪里沟通?为什么我的属性被宣布为64位整数,而该值却在32位中?

显然一个大整数

这绝不是明显的。地球的质量不是千分之一的千克数量。您不应该为此应用使用任何积分类型。将整数用于真实整数的事物,例如序列中的元素数量。

使用double进行准确测量到十进制位置的物理量。质量,体积,长度,力等等,应始终为双倍。

这也将使您摆脱这些难以读的数字。双打让您使用科学符号,因为双打是科学的:

Mass = 3.3011E23,

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

我还注意到您有一个"距离",这似乎是汞的半轴轴。您为什么只存储半轴轴,为什么不称其为什么?

我还注意到,您已经将单元遍布到各地 - 米,几天和几年等。为什么不将所有内容保持在标准单元中?仪表长度,时间为千克,质量千克。您会发现,当您始终使用标准单元时,您会遇到更少的愚蠢算术错误。

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

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

查找如何存储浮点数以获得更好的理解。如果要将其存储在浮标中,则可以执行此3301100000000000000000.0F

必须在c#

中用L后缀l文字。
Mass = 123456789012345L

尽管这显然无法使您存储大于64位的数字:)

为什么不使用浮点类型?

正如其他人指出的那样,您的数字太大而无法适合UINT64结构。因此,您将需要BigInteger,或者可能需要另一种更宽,可变的数字类型,例如Double。因此,您的模型声明这样的 Mass属性:

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

接下来,您必须使用D的数字字面形式,例如:

Mass = 330110000000000000000000D, //In Kilograms

您像往常一样格式化显示数字:

mercury.Mass.ToString("N0");

您在这里遇到一个小问题,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,该值也太大了。Int64.MaxValue是:

9223372036854775807

您有:

330110000000000000000000

甚至未签名,这是太大的数量级。您可以使用BigInteger之类的东西。

相关内容

最新更新