我正在构建一个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位?
答案 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 large。 Int64.MaxValue
是:
9223372036854775807
你有:
330110000000000000000000
即使是无符号,也是数量级太大。您可以使用something like BigInteger
instead。