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

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位?

Eri*_*ert 7

显然是一个大整数

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

使用double该被精确到十ISH小数的物理量.质量,体积,长度,力等应始终为双倍.

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

Mass = 3.3011E23,
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • @maccettura:你真的相信这个星球的质量正好*330110000000000000000千克?或者你认为那里可能存在一些错误,数量级在1000亿左右?如果你愿意在初始估算中忍受100亿到100万公斤的误差,那么**你为什么担心**中的微小浮点误差?*测量误差*可能比*浮点表示误差*大*十个数量级*.担心重要的错误! (3认同)
  • @maccettura:那你问这个问题是个好主意.当你试图表示精确的十进制算术*时,担心浮动错误的原因是* - 例如,财务计算,其中`$ 123.45`需要*正好*123.45`,而不是`123.449999999999998`.对于C#中的财务计算,请使用`decimal`; 它精确到小数点后29位,十进制数没有表示错误.对于*物理*问题使用`double`,你有很大的数量,但精度有限. (2认同)