C#"积分常数太大" - 对于Int32类型,整数变量太大

时间:2017-09-22 17:35:16

标签: c# asp.net integer integer-overflow

我正在构建一个ASP.NET Core API,它返回太阳系中的周期表和行星。主要是使用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
                },

我在第一个' 3'上出现红色错误。在我的弥撒中,上面的错误。然而,当我将鼠标移到Mass上时,它会显示:" long PlanetMode.Mass {get;组;} 当我将鼠标悬停在等号上时,它会显示:" struct System.Int64"

错误传达在哪里?为什么我的属性声明为64位整数,但值是否为32位?

6 个答案:

答案 0 :(得分:7)

  

显然是一个大整数

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

double用于精确测量到十位小数位的物理量。质量,体积,长度,力等应始终是双倍的。

这也可以让你摆脱那些难以阅读的数字。双打允许你使用科学记数法,因为双重用于科学

Mass = 3.3011E23,

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

我还注意到你有一个"距离"这似乎是水星情况下的半长轴。你为什么只存储半长轴,为什么不把它称之为它?

我还注意到你把你的单位混在一起 - 米和公里,天和年,等等。为什么不把所有东西都放在标准单元米的长度,秒的时间,千克的质量。当您始终如一地使用标准单位时,您会发现减少了愚蠢的算术错误。

答案 1 :(得分:2)

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

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

查看如何存储浮点数以更好地理解。如果要将其存储在浮点数中,可以执行此操作330110000000000000000000.0f

答案 2 :(得分:1)

长文字必须以C#

中的L为后缀
Mass = 123456789012345L

虽然这显然不会让你在长时间内存储大于64位的数字:)

为什么不使用浮点类型?

答案 3 :(得分:1)

正如其他人所指出的那样,你的号码太大而不适合UInt64结构。 因此,您需要BigInteger,或者可能需要另一种更宽,可变的数字类型,例如double。因此,您的模型会声明Mass属性,如下所示:

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

接下来,您必须使用D为数字文字加上后缀,如下所示:

Mass = 330110000000000000000000D, //In Kilograms

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

mercury.Mass.ToString("N0");

答案 4 :(得分:0)

这里有一个小问题,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

答案 5 :(得分:0)

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

9223372036854775807

你有:

330110000000000000000000

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