as.*_*ieu 1 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.
Run Code Online (Sandbox Code Playgroud)
这是我正在描述属性的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
...
Run Code Online (Sandbox Code Playgroud)
然而,当我转移到我的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
},
Run Code Online (Sandbox Code Playgroud)
我的Mass中的第一个'3'出现红色错误,上面的错误.然而,当我将鼠标移到Mass上时,它会显示:"long PlanetMode.Mass {get; set;}当我将鼠标移到equals上时,它会显示:"struct System.Int64"
错误沟通在哪里?为什么我的属性声明为64位整数,但值是否为32位?
显然是一个大整数
这绝不是显而易见的.地球的质量不是千克的整数.您不应该为此应用程序使用任何整数类型.对于真正整数的事物使用整数,例如序列中元素的数量.
使用double该被精确到十ISH小数的物理量.质量,体积,长度,力等应始终为双倍.
这也可以让你摆脱那些难以阅读的数字.双打允许你使用科学记数法,因为双打用于科学:
Mass = 3.3011E23,
Run Code Online (Sandbox Code Playgroud)
此外,在我们查看您的解决方案时,我注意到对于球形行星,可以从半径计算体积.你可能不想存储两者; 相反,只需存储一个并在需要时计算另一个.
我还注意到你有一个"距离",在水星的情况下似乎是半长轴.你为什么只存储半长轴,为什么不把它称之为什么?
我还注意到你把你的单位混在一起 - 米和公里,几天和几年,等等.为什么不把所有东西都放在标准单元 米的长度,秒的时间,千克的质量.当您始终如一地使用标准单位时,您会发现减少了愚蠢的算术错误.