我正在构建一个 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
},
我在我的 Mass 中的第一个“3”上出现了一个红色的波浪形错误,错误如上。然而,当我将鼠标悬停在 Mass 上时,它会显示:“long PlanetMode.Mass {get; set;} 当我将鼠标悬停在等号上时,它显示为:“struct System.Int64”
错误传达在哪里?为什么我的属性声明为 64 位整数,但值却停留在 32 位?
最佳答案
Obviously a large integer
这绝不是显而易见的。地球的质量不是千克的整数。您不应该为此应用程序使用任何整数类型。将整数用于真正整数的事物,例如序列中的元素数。
对于精确测量到小数点后十位的物理量,使用double
。质量、体积、长度、力等应始终为双数。
这也会让您摆脱那些难以阅读的数字。 double 允许您使用科学记数法,因为 double 是为了科学:
Mass = 3.3011E23,
此外,在我们研究您的解决方案时,我注意到对于球形行星,可以根据半径计算体积。您可能不想同时存储两者;相反,只需存储一个并在需要时计算另一个。
我还注意到你有一个单一的“距离”,它似乎是水星的半长轴。为什么只存储半长轴,为什么不按原样命名?
我还注意到,您到处都混淆了单位——米和公里、天和年等等。为什么不将所有内容都保留在标准单位中?长度为米,时间为秒,质量为千克。如果您始终如一地使用标准单位,您会发现愚蠢的算术错误会减少。
关于C# "Integral constant is too large"- Int32 类型的整数变量太大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46370302/